C标准规定了calloc()
的以下内容:
calloc函数为nmemb对象数组分配空间,每个对象的大小都是size。空间初始化为所有位零。
以下警告与所有位零:
有关请注意,这不一定与浮点零或空指针常量的表示相同。
测试程序:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char** list = calloc(10, sizeof(*list));
int i;
for (i = 0; i < 10; i++)
{
printf("%p is-null=%d\n", list[i], NULL == list[i]);
}
free(list);
return 0;
}
我用以下编译器构建并执行了这个程序:
在所有情况下所有位零是一个NULL
指针(除非我在测试程序中犯了错误)。
C标准不能保证NULL
指针所有位为零的原因是什么?出于好奇,有没有所有位为零的编译器不是NULL
指针?
答案 0 :(得分:10)
com.lang.c FAQ在question 5.16中回答了这个问题,它解释了为什么会发生这种情况,question 5.17,它提供了非零NULL
的实际机器示例。相对“常见”的情况是地址0有效,因此为NULL
选择了不同的无效地址。一个更为深奥的例子是Symbolics Lisp机器,它甚至没有我们所知的指针。
因此,选择正确的编译器并不是一个真正的问题。在具有或不具有虚拟内存的现代字节可寻址系统上,您不太可能遇到不是地址0的NULL
指针。
C标准经过精心设计,可以容纳奇怪的硬件,这只是结果之一。另一个奇怪的问题是,sizeof(void *) != sizeof(int *)
可能是{{1}},但你永远不会在字节可寻址架构上看到它。
答案 1 :(得分:4)