繁体   English   中英

在 C 中具有指针结构的 Calloc

[英]Calloc with structure with pointers in C

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

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

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

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

谢谢!

不知何故,你得到了很多不正确的答案。 C 不需要 null 指针的表示为全零位。 许多人错误地认为它确实如此,因为值 0 的 integer 常量表达式转换为指针后变成了 null 指针。

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

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

N1548 (C11 草案)

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

然后脚注说(强调):

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

虽然 null 指针通常表示为全 0 位,但不能保证这种表示。 要直接回答您的问题,,您不能依赖calloc()结构的指针是NULL


如果要将动态分配的结构的所有包含的指针设置为NULL可以使用以下命令:

struct a *s = malloc(sizeof *s);
*s = (struct a){0};

C11:

6.7.9.21如果大括号括起来的列表中的初始化程序少于聚合的元素或成员,[...] 聚合的其余部分应隐式初始化,与具有 static 存储持续时间的对象相同

6.7.9.10 ... 如果具有 static 或线程存储持续时间的 object 未显式初始化,则:
— 如果它具有指针类型,则将其初始化为 null 指针;

C 要求您在大括号内至少有一个元素,这就是我使用{0}而不是{}的原因。 元素的rest按照上述规则初始化,得到null指针。 据我所知,C11 和 C99 中的规则是相同的。

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

static char * a[100];

数组中的所有指针都是 NULL。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM