我知道 calloc 请求要使用的内存,在所有位上写入 0,然后返回指向它的指针。
我的问题是:如果我将 calloc 与包含指针的结构一起使用,这些指针会具有 NULL 值还是我必须将它们设置为指向 NULL?
struct a{
char * name;
void * p;
}* A;
所以基本上,在我将 calloc 与 struct a 一起使用后,name 和 p 会指向 NULL 吗?
谢谢!
不知何故,你得到了很多不正确的答案。C 不要求空指针的表示为全零位。许多人错误地认为它确实如此,因为值为 0 的整数常量表达式转换为指针后变为空指针。
话虽如此,在所有现实世界的系统上,空指针都是全零位,并且calloc
是在现实世界中获得空指针初始化的指针数组的完全合理的方法。
R.的答案很好,但我想添加标准引号来支持这一点,并展示一种 0 初始化你的结构的方法,它实际上会产生 NULL 指针。
从N1548(C11 草案)
7.22.3.2 calloc 函数为 nmemb 对象数组分配空间,每个对象的大小都是 size。空间被初始化为所有位为零。[289]
然后脚注说(强调):
请注意,这不必与浮点零或空指针常量的表示相同。
虽然空指针通常表示为全 0 位,但不能保证这种表示。要直接回答您的问题,不,您不能依赖calloc()
'd 结构的指针是NULL
.
如果要将动态分配的结构的所有包含的指针设置为NULL
,可以使用以下命令:
struct a *s = malloc(sizeof *s);
*s = (struct a){0};
C11:
6.7.9.21 如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,[...] 聚合的其余部分应被隐式初始化,与具有静态存储持续时间的对象相同
和
6.7.9.10 ... 如果具有静态或线程存储持续时间的对象未显式初始化,则:
— 如果它具有指针类型,则将其初始化为空指针;
C 要求您在大括号内至少有一个元素,这就是我使用{0}
而不是{}
. 其余元素根据上述规则进行初始化,从而产生空指针。据我所知,C11 和 C99 中的规则是相同的。
ISO C 标准calloc
要求它将所有内容初始化为0
. 这意味着,如果您最终查看calloc
as 指针分配的内存,它最初确实会包含 NULL (0) 指针。