【发布时间】:2012-10-26 10:24:13
【问题描述】:
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;
}
我使用以下编译器构建并执行了这个程序:
- VC7、VC8、VC9、VC10
- gcc v4.1.2,gcc v4.3.4
- Forte 5.8,Forte 5.10
在所有情况下所有位为零都是NULL指针(除非我在测试程序中犯了错误)。
C 标准不保证NULL 指针所有位为零 的原因是什么?出于好奇,是否有任何编译器 所有位为零 不是 NULL 指针?
【问题讨论】:
-
This 可能感兴趣。
-
如果没有必要并且没有明显的好处,为什么要在标准化方面过于具体?
-
@ecatmur 虽然链接的问题只问“如果”,但这个问题会问“为什么”。我认为如果删除
calloc和编译器残骸,这个会更好。 -
可能有一些这样的奇异系统;更好的问题是是否有任何相关系统。我会说答案很可能是否定的。就其价值而言,C 标准允许的许多事物(例如非二进制补码整数)从未 出现在实现中,并且非全零位空指针是就在这种糟糕的程度。
-
@R.. 实际上,补码通常存在于电子秤系统的细分市场中。我怀疑此类系统的许多实现会在内部使用一个补码,但我不知道它们是使用主流 MCU(带有 2 的补码)还是一些自定义解决方案。
标签: c