Calloc结构与C中的指针

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是在现实世界中获得空指针初始化指针数组的完美合理方法.

  • +1:我见过的唯一答案甚至接近正确.我相信一些IBM和Unisys系统使用空指针,其中并非所有位都为零.就此而言,x86也可以 - 无论偏移如何,段值0都会给出空指针.所有位零都可以工作,但其他空指针值也是可行的. (3认同)

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的规则是相同的.