calloc(),指针和所有位零

hmj*_*mjd 8 c

可能重复:
C中的NULL总是为零?

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;
}
Run Code Online (Sandbox Code Playgroud)

我用以下编译器构建并执行了这个程序:

  • VC7,VC8,VC9,VC10
  • gcc v4.1.2,gcc v4.3.4
  • Forte 5.8,Forte 5.10

在所有情况下,所有位零都是NULL指针(除非我在测试程序中犯了错误).

是什么原因NULL导致C标准不能保证指针是零位?出于好奇,是否有任何编译器所有位零都不是NULL指针?

Die*_*Epp 10

com.lang.c常见问题解答这问题5.16,它解释了为什么出现这种情况,并质疑5.17,它给出了实际机的例子具有非零NULL.相对"常见"的情况是地址0有效,因此选择不同的无效地址NULL.一个更为深奥的例子是Symbolics Lisp机器,它甚至没有我们所知的指针.

因此,选择正确的编译器并不是一个真正的问题.在具有或不具有虚拟内存的现代字节可寻址系统上,您不太可能遇到NULL不是地址0 的指针.

C标准经过精心设计,以适应奇怪的硬件,这只是结果之一.另一个奇怪的问题是,它是可能的sizeof(void *) != sizeof(int *),但你永远不会看到它发生在字节可寻址的架构上.