Mih*_*csu 12 c null pointers structure calloc
我知道要使用的calloc请求内存,在所有位上写0,然后返回指向它的指针.
我的问题是:如果我使用包含指针的结构的calloc,那些指针会有NULL值还是我必须将它们设置为指向NULL?
struct a{
char * name;
void * p;
}* A;
Run Code Online (Sandbox Code Playgroud)
所以基本上,在我使用带有struct a的calloc之后,name和p会指向NULL吗?
谢谢!
R..*_*R.. 23
不知何故,你得到了很多不正确的答案.C不要求空指针的表示为全零位.许多人错误地认为它确实如此,因为转换为指针的值为0的整数常量表达式变为空指针.
话虽如此,在所有真实世界的系统中,空指针都是全零位,并且calloc是在现实世界中获得空指针初始化指针数组的完美合理方法.
Rya*_*ing 16
R.的答案很好,但我想添加标准引号来支持这一点,并展示了一种初始化结构的方法,实际上会产生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};
Run Code Online (Sandbox Code Playgroud)
C11:
6.7.9.21 如果括号括起的列表中的初始值设定项少于聚合的元素或成员,则聚合的其余部分应与具有静态存储持续时间的对象隐式初始化
和
6.7.9.10 ...如果没有显式初始化具有静态或线程存储持续时间的对象,则:
- 如果它具有指针类型,则将其初始化为空指针;
C要求你在大括号内至少有一个元素,这就是我使用{0}而不是{}.其余元素根据上述规则进行初始化,从而产生空指针.据我所知,C11和C99的规则是相同的.