首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言:为什么malloc()返回一个指针,而不是值?

在C语言中,malloc()函数返回一个指针,而不是值,主要是因为以下原因:

  1. 动态内存分配:malloc()函数用于动态地分配内存,它在堆内存中为所需的数据类型分配内存空间。由于分配的内存大小可能不同,因此无法直接返回一个值。通过返回指针,可以确保内存分配的大小与实际数据类型相匹配。
  2. 指针操作:指针是C语言中非常重要的概念,它允许程序员直接操作内存地址。通过返回指针,程序员可以直接操作分配的内存空间,从而实现对内存的高效管理。
  3. 灵活性:返回指针可以使程序更加灵活,因为它允许程序员在分配的内存空间中存储不同类型的数据。这使得程序可以根据需要动态地调整其内存使用方式。
  4. 错误处理:malloc()函数在分配内存失败时返回一个空指针(NULL),这样程序员可以通过检查返回值是否为空指针来判断内存分配是否成功。如果malloc()返回了一个整数值,那么判断内存分配是否成功将变得更加困难。

总之,malloc()函数返回一个指针,而不是值,是为了实现动态内存分配、指针操作、灵活性和错误处理等功能,从而更好地满足C语言程序的需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java – 为什么InputStream#read()返回一个int不是一个字节?

但是为何方法InputStream#read()需要返回int类型呢?...首先,我们要完成一个EOF(End of File)判断,在Java中就是以-1来表示数据读完了,但是如果返回的char类型,那么根本没有-1这个数值;如果换种方式,返回一个特殊的char,比如char...中的-1,那么就占用了此字符,如果字节数据恰好对应-1,那么就无法被正确读出,且会被错误认为i字节数据读好了,这就是返回int类型的原因,当然,字节数据被转为int表示,需要高24位布零。...其次,既然只是如上的需求,那么为什么返回short呢? 实际上在Java内存模型中,对于short以及int类型,都是占据32位的内存空间的。...换言之,我们没有在这个应用中返回int/short类型的数据是没有区别的,所以我们不妨就使用代表其实际内存模型的int类型

1.2K20

C语言中的函数为什么只能有一个返回输出?怎么实现多个输出?

这是典型的C语言中函数模块中的返回问题,算是常见的语法细节,很多人觉得C语言已经过时了,只能代表着这类人还不算是真正的技术人员,在嵌入式领域C语言依然充当着非常重要的角色,C语言在很多领域还是首选编程语言...具体功能实现,最后是结果的输出,也就是这个题目的返回,在正常情况下函数的返回只有一个,但在实际编程中需要用到多个,在设计时候还是归结成一类,如果类型相近可以弄成数组方式,如果类型不太一致直接放在结构体中执行...2.结构体指针返回 结构体是C语言涉及数据结构的最直接的容器,通常在编程过程中实现一个功能模块,模块中的数据通常都会放在一个结构体中,在在功能函数中对结构体中的数值进行操作,因为结构体中可以放足够多的变量...,如果函数返回是个指针的话,就能把整个结构体里面的内容返回出来,同样能够达到返回多个数值的作用,这种在平常的编程过程中用的最多,C语言中使用最频繁的关键点就是指针了,但也是很多初学者最不好理解的知识点...C语言中如果掌握了结构体和指针基本上C语言将近一半的知识点就拿下了,当然直接返回结构体指针的方式属于非常常见的编程方式。 ?

7.1K30

C++ 利用指针和结构体实现一个函数返回多个

在函数执行到return语句时,将不再向下执行,那么如何让函数一次性返回多个? 一般可以用两种方式解决这个问题,利用指针和利用结构体。...: 1 2 3 可以看到,我们其实定义了一个int类型的指针作为函数test的类型,所以这个函数的返回也应该是一个int类型的指针,所以在第15行,我们定义了一个presult指针,并让它指向一个三个元素的数组...**(在这里,其实我们并没有定义数组,而是使用了动态内存分配的方式)**然后将三个形参分别写入到数组里,最后将指针作为函数的返回返回。显然这个函数的功能是没有意义的,在这里只做演示而已。...利用指针作为函数的返回的方式有一个很大的弊端,不管返回几个,他们的类型都是相同的。所以为了避免这个问题,我还需要另一种方式,利用结构体。...也是result类型的变量,test的返回值当然也是一个result类型的

67650

C++ 利用指针和结构体实现一个函数返回多个

参考链接: C++结构指针 在函数执行到return语句时,将不再向下执行,那么如何让函数一次性返回多个?  一般可以用两种方式解决这个问题,利用指针和利用结构体。 ...presult; }  运行结果:  1  2  3  可以看到,我们其实定义了一个int类型的指针作为函数test的类型,所以这个函数的返回也应该是一个int类型的指针,所以在第15行,我们定义了一个...(在这里,其实我们并没有定义数组,而是使用了动态内存分配的方式)然后将三个形参分别写入到数组里,最后将指针作为函数的返回返回。显然这个函数的功能是没有意义的,在这里只做演示而已。 ...利用指针作为函数的返回的方式有一个很大的弊端,不管返回几个,他们的类型都是相同的。所以为了避免这个问题,我还需要另一种方式,利用结构体。 ...也是result类型的变量,test的返回值当然也是一个result类型的

84720

C语言free释放内存后为什么指针里的不变?竟然还可以输出?

今天你家范儿给大家带来一个的东西——关于C语言为什么释放指针后,指向这块内存的指针不变问题的编程经验!!行了,咱们话不多少,直接上主食。...诸位,可得细看呦~ 想必大家都知道C语言中动态开辟内存之后,必须要释放内存,来防止内存泄露。也就是malloc之后,必须要free。...正所谓”有借有还,再借不难”, 不少同学会问为什么释放指针后,指向这块内存的指针不变呢,我们今天为大家揭秘。...首先,我们用malloc开辟一个内存,用strcpy拷贝一串字符串,然后释放掉,通过断点调试进行观察!...但指针所指向的内存,并不会发生改变。就可以比方说,你租了一套房子,到期后,房子收回归还房东,此时你可能还拿着房子的钥匙,这个时候你虽然可以继续访问这个房子(内存),但已经不属于你,是非法的。

2.4K80

为什么 C# 的 string.Empty 是一个静态只读字段,不是一个常量呢?

使用 C# 语言编写字符串常量的时候,你可能会发现可以使用 "" 不能使用 string.Empty。...进一步可以发现 string.Empty 实际上是一个静态只读字段,不是一个常量。 为什么这个看起来最适合是常量的 string.Empty,竟然使用静态只读字段呢?...string.Empty 需要是一个静态只读字段不是常量?...从上文中 string.Empty 的注释描述中可以知道: 编译器会将 C# 语言编译成中间语言 MSIL; 如果这是一个常量,那么编译器在不做特殊处理的情况下,就会生成 ldstr "",而这种方式不会调用到...当然,事实上编译器也可以针对此场景做特殊处理,但为什么不是在编译这一层进行特殊处理,我已经找不到出处了。 本文引申的其他问题 能否反射修改 string.Empty 的? 不行!

1K00

C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回状态 | 形参指针处理 | 形参指针判空 | 形参返回 )

, 一个指向首部 , 一个指向尾部 , 进行 翻转 , 逆序 等操作 ; 字符串翻转模型 : 借助 指针 进行翻转 , 或 借助 栈 后进先出的特性 , 进行 翻转 ; 一、业务子函数接口定义要点...---- 在上一篇博客 【C 语言】字符串模型 ( strstr-while 模型 ) 的基础上 , 将相关功能封装成 API 函数 , 将 主函数 与 子业务 函数分离开 ; 自定义函数接口 ; 分离...接收 函数形参变量 , 尽量不修改 函数 形参 的 ; 形参指针判空 : 凡是传入的指针 , 一律判定指针是否合法 ; 形参返回处理 : 返回不要直接修改 , 先定义临时局部变量保存返回 , 最后执行完毕..., 再将返回 通过 间接赋值 赋值给 形参中的 返回指针 指向的 内存地址 ; /* * 获取字符串中子串个数接口 * char *main_str : 大字符串 * char *sub_str...返回临时值, 先不要修改 sub_count 指针指向的 , 最后计算完毕后再修改 int sub_count_tmp = 0; // 判定指针是否合法 // 如果形参指针

3.1K10

C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回 | 函数返回 | 形参指针判空 | 形参返回操作 )

文章目录 一、将 两头堵模型 抽象成业务模块函数 二、完整代码示例 一、将 两头堵模型 抽象成业务模块函数 ---- 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回 : 函数的返回 ,...一般使用 函数形参 间接赋值 进行返回 ; 下面的代码中 int *count 是返回 ; int get_count(char *str_all, int *count) 函数返回 : 函数的返回..., 反映的是函数的执行结果状态 , 返回 0 执行成功 , 返回 -1 执行失败 ; 形参指针判空 : 函数的第一项任务就是 判定 形参指针是否合法 , 如果任何一个指针为空 , 直接返回 -1 ;...== NULL || count == NULL"); return -1; } 形参返回操作 : 函数的真正返回 , 不要急着写入到指针指向的内存中 , 先放在局部变量中...= '\0') { i++; } // 循环条件是 j 指针指向的 位置 为空 则继续循环 // 遇到第一个不为空的字符 , 便停止循环 //

69220

C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回 | 函数返回 | 函数形参处理 | 形参指针判空 )

文章目录 一、字符串翻转模型 业务函数 二、完整代码示例 一、字符串翻转模型 业务函数 ---- 将上一篇博客 【C 语言】字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数...; 字符串翻转模型 业务函数 要点 : 形参返回 : 函数的返回 , 一般使用 函数形参 间接赋值 进行返回 ; 下面的代码中 char *str 是返回 ; int inverse(char *...str) 函数返回 : 函数的返回 , 反映的是函数的执行结果状态 , 返回 0 执行成功 , 返回 -1 执行失败 ; 函数形参处理 : 在 函数中 , 如果涉及到修改 形参 指针变量 , 一般不直接使用形参...: 函数的第一项任务就是 判定 形参指针是否合法 , 如果任何一个指针为空 , 直接返回 -1 ; // 判断传入的字符串指针是否为空 if(str_tmp == NULL)...= c; // 指向头部的指针自增 p_start++; // 指向尾部的指针自减 p_end--; } return

90610

c语言malloc的作用,malloc函数-malloc函数,详解

如果 size 的为 0,那么返回会因标准库实现的不同不同,可能是 NULL,也可能不是,但返回指针不应该再次被引用。...注意:函数的返回类型是 void *,void 并不是说没有返回或者返回指针,而是返回指针类型未知。...malloc分配空间,是指系统按照的你程序在内存堆栈中分配一段内存给你,该内存段的首地址赋值给你的p,这是基本的指针概念,为什么要强调这个?...(int *)对malloc返回强制转换,第二条不用?...强制转换本来就不是必须的,malloc()返回的是void *类型的,会根据不同的指针变量自动转换成所需要的类型,只不过在有些编译系统中,不加类型转换会收到WRONG而已。

2K30

再论c语言里面的void类型本质和NULL

(2)void的一个典型应用,想必大多数读者都看到过,就是malloc返回;我们知道malloc向系统堆管理器申请一段内存给当前程序使用,malloc返回的是一个指针,这个指针指向申请的那段内存。...malloc刚申请的这段内存尚未用来存储数据,malloc函数也无法预知这段内存将来被存放什么类型的数据,所以malloc无法返回具体类型的指针,解决方法就是返回一个void *类型,告诉外部我返回的是一段干净的内存空间...(4)void 类型使用时一般都是用void *,不是仅仅使用void。 NULL 新媒体排版 1NULL在C/C++中的标准定义: (1)NULL不是C语言关键字,本质上是一个宏定义。...这时候p就不是指针了。 (3)为什么要让一个指针指向内存地址0处?主要是因为在大部分的CPU中,内存的0地址处都不是可以随便访问的(一般都是操作系统严密管控区域,所以应用程序不能随便访问)。...3为什么需要NULL: (1)第一个作用就是让野指针指向0地址处安全。 (2)第二个作用就是一个特殊标记。

67330

C++ 中 mallocfree与 newdelete区别

malloc/free 是 C++/C 语言的标准库函数 ——本质区别; 操作对象范围不同 new/delete 是 C++ 里才有的, new/delete 与 malloc/free 一个显著的区别在于...由于 malloc/free 是库函数不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free 。...void * malloc(size_t size); 1、malloc 返回的类型是 void *,所以在调用 malloc 时要显式地进行类型转换,将 void * 转换成所需要的指针类型。...因此,C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。new/delete不是库函数,而是运算符。...或许你会问,既然new/delete的功能完全可以实现malloc/free的功能,为什么C++中不把malloc/free淘汰掉呢,这可能涉及到一个兼容性问题,C++程序要经常调用C函数,C语言中只能用

88620

C语言进阶篇】常用动态内存分配 malloc calloc realloc free

鸽芷咕:个人主页 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!...动态内存分配可以改变这一现象!当我们需要多少就可以规划多少,不需要时就可以释放掉,这样是不是就可以极大地避免了内存的浪费! 本期文章收录在《C语言高阶篇》,大家有兴趣可以看看呐!...如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc返回一定要做检查。...很简单我们把 malloc返回类型强制转换为 int* 拿整形指针接收 malloc返回就可以 #include #include int main...函数返回失败怎么办 如果开辟失败,则返回一个NULL指针,因此malloc返回一定要做检查。

22310

应该对 malloc 返回进行转换么

举个例子, 应该这样, int *sieve = malloc(sizeof(int) * length); 不是, int *sieve = (int *) malloc(sizeof(int) *...回答 C 中,从 void* 到其它类型的指针是自动转换的,所以无需手动加上类型转换。 在旧式的 C 编译器里,如果一个函数没有原型声明,那么编译器会认为这个函数返回 int。...那么,如果碰巧代码里忘记包含头文件 ,那么编译器看到 malloc 调用时,会认为它返回一个 int。 在实际运行时,malloc返回一个 void* 指针),会被直接解释成一个 int。...如果这时没有强转 malloc返回,编译器看到要把 int 转换为 int* ,就会发出一条警告。如果强转了 malloc返回,编译器就不会做警告了,在运行时就可能出问题。...注意,以上都是以 C 语言为基础上成立的,在 C++ 中则是不一样,C++ 是不允许 void* 隐式转换为其它类型的,所以需要显示转换,一般用 static_cast。

65010

C语言C++的区别和联系

1、C语言是面向过程语言C++是面向对象语言 我们都知道C语言是面向过程语言C++是面向对象语言,说CC++的区别,也就是在比较面向过程和面向对象的区别。...3、返回 C语言中,如果一个函数没有指定返回类型,默认返回int类型;C++中,如果一个函数没有返回则必须指定为void。...(C语言没有函数重载,C++支持函数重载)。 C语言中产生函数符号的规则是根据名称产生,这也就注定了c语言不存在函数重载的概念。C++生成函数符号则考虑了函数名、参数个数、参数类型。...那如果你就是非要引用一个立即数,其实也不是没有办法: constint &b = 10; 即将这个立即数用const修饰一下,就可以了。为什么呢?...malloc()和free()是C语言中动态申请内存和释放内存的标准库中的函数。new和delete是C++运算符、关键字。new和delete底层其实还是调用了malloc和free。

1.1K10

C语言C++的区别和联系

1、C语言是面向过程语言C++是面向对象语言 我们都知道C语言是面向过程语言C++是面向对象语言,说CC++的区别,也就是在比较面向过程和面向对象的区别。...3、返回 C语言中,如果一个函数没有指定返回类型,默认返回int类型;C++中,如果一个函数没有返回则必须指定为void。...(C语言没有函数重载,C++支持函数重载)。 C语言中产生函数符号的规则是根据名称产生,这也就注定了c语言不存在函数重载的概念。C++生成函数符号则考虑了函数名、参数个数、参数类型。...那如果你就是非要引用一个立即数,其实也不是没有办法: constint &b  = 10; 即将这个立即数用const修饰一下,就可以了。为什么呢?...malloc()和free()是C语言中动态申请内存和释放内存的标准库中的函数。new和delete是C++运算符、关键字。new和delete底层其实还是调用了malloc和free。

2.5K30

C++】CC++内存管理

3.1 new/delete操作内置类型 在C语言中: 我们使用malloc/calloc去申请空间,是不是需要自己计算需要开辟空间的大小,然后传参,返回呢是void*,还需要我们自己强转。...当然也是有可能的,但是new失败不是返回指针,而是抛异常,那关于异常我们后面也会讲到。...那除了new这个操作符之外呢,我们再来学一个操作符叫做delete: 我们C语言阶段使用malloc/calloc在堆上开辟出来的空间使用完是不是要使用free释放啊。...,我们知道C++是一门基于面向对象的编程语言,面向对象的编程语言在发生错误时一般都是抛异常的,C语言这些malloc函数发生错误时是不是都不会抛异常啊,像malloc如果申请失败是返回指针,是不是不满足需求啊...new在申请空间失败时是抛异常,malloc返回NULL。

14210

c语言进阶部分详解(详细解析动态内存管理)

/just-a-try: 学习c语言的过程、真 (github.com) 今天来介绍动态内存管理 的相关内容: 一.为什么存在动态内存分配 我们熟悉的内存开辟方法: int a = 20;//在栈空间上开辟四个字节的空间...这时候就只能试试动态存开辟了 各种变量存储位置: 二.动态内存函数的介绍 2.1 malloc( )函数 malloc函数是C语言中的一个动态内存分配函数,用于在程序运行时动态地分配内存空间...malloc函数返回一个void类型的指针,指向分配的内存空间的起始地址。...如果分配失败,则返回NULL 如果开辟成功,则返回一个指向开辟好空间的指针 如果开辟失败,则返回一个NULL指针,因此malloc返回一定要做检查 返回的类型是 void* ,所以malloc函数并不知道开辟空间的类型...,具体在使用的时候使用者自己来决定 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器 2.2free( )函数 free函数是C语言中的一个内存释放函数,用于释放之前使用malloc

7710
领券