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)指针。