将NULL作为malloc(sizeof())参数是否返回NULL及相关内存分配问题
问题1解答
首先澄清表述歧义:你提到的「将NULL作为malloc(sizeof())的参数」对应两种常见场景,行为完全不同:
- 场景1:直接把NULL作为malloc的入参,即代码写为
malloc(NULL)
NULL是C标准定义的空指针常量,通常实现为(void *)0或者0,传入malloc时会隐式转换为size_t类型的0,等价于调用malloc(0)。C标准没有规定malloc(0)的返回值,不同编译器的标准库实现有两种行为:要么返回NULL,要么返回一个指向最小分配单元的非空指针,但这个指针不允许解引用访问,也不会分配可实际使用的内存空间。 - 场景2:把NULL作为sizeof的参数传入malloc,即代码写为
malloc(sizeof(NULL))
这种情况下sizeof计算的是空指针的字节长度,32位系统下是4字节,64位系统下是8字节,相当于你申请了对应大小的内存,只要系统内存不是极端不足,malloc会返回指向该内存块的有效非空指针,不会返回NULL。
问题2解答
你需要先明确两个核心概念的区别:NULL本身这个常量,和你malloc申请的内存是完全无关的两个东西:
- 首先,
NULL是C语言定义的编译期常量,它本身不需要你主动分配内存:它的值在编译阶段就已经确定为0,要么直接作为立即数在代码指令里携带,要么存放在程序的只读常量段,运行时本来就会加载到RAM里,和你写不写malloc代码没有关系。 - 你写的
TheNull = malloc(sizeof(NULL));这行代码,本质是「申请一块和空指针长度相同的内存,把这块内存的地址赋值给TheNull指针」,你申请的这块内存是用来存其他数据的,不是用来存NULL常量本身的,不存在「给NULL分配内存」的说法。比如你可以把其他指针的值存到这块内存里:*(void **)TheNull = &some_var;,这时候你用的是malloc申请的内存,和NULL常量没有任何关联。 - 如果你误以为这行代码是给NULL分配内存,那完全是误解:NULL是常量,不能被赋值,也不需要你分配空间存储它,它的存储位置是编译器决定的,和你调用malloc没有任何关联。
内容的提问来源于stack exchange,提问作者NoahVerner
相关产品推荐
相关产品推荐

