Calloc结构与指针在C中

我知道要使用的calloc请求内存,在所有位上写入0然后返回指向它的指针。

我的问题是:如果我使用包含指针的结构的calloc,那些指针会有NULL值还是我必须将它们设置为指向NULL?

struct a{ char * name; void * p; }* A; 

所以基本上,在我使用带有struct a的calloc之后,name和p会指向NULL吗?

谢谢!

不知怎的,你得到了很多不正确的答案。 C不要求空指针的表示为全零位。 许多人错误地认为它确实如此,因为转换为指针的值为0的整数常量表达式变为空指针。

话虽如此,在所有真实世界的系统中,空指针都是全零位,而calloc是在现实世界中获得空指针初始化指针数组的完美合理方法。

R.的答案很好,但我想添加标准引号来支持这一点,并展示一种方法来初始化你的结构,实际上,它会产生NULL指针。

从N1548 (C11草案)

7.22.3.2 calloc函数为nmemb对象数组分配空间,每个对象的大小都是size。 该空间初始化为所有位零。[289]

然后脚注说(重点补充):

请注意,这不必与浮点零或空指针常量的表示相同

虽然空指针通常表示为全0位,但不保证此表示。 要直接回答你的问题,不能不依赖calloc() ‘d struct的指针为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的规则是相同的。

是他们会。 同样,如果你这样做:

 static char * a[100]; 

数组中的所有指针都将为NULL。

calloc的ISO C标准要求它将所有内容初始化为0 。 这意味着如果你最终将calloc分配的内存作为指针,它最初将包含NULL(0)指针。