13

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

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

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

所以基本上,在我将 calloc 与 struct a 一起使用后,name 和 p 会指向 NULL 吗?

谢谢!

4

3 回答 3

27

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

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

于 2011-05-02T13:24:08.987 回答
19

R.的答案很好,但我想添加标准引号来支持这一点,并展示一种 0 初始化你的结构的方法,它实际上会产生 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};

C11:

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

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

C 要求您在大括号内至少有一个元素,这就是我使用{0}而不是{}. 其余元素根据上述规则进行初始化,从而产生空指针。据我所知,C11 和 C99 中的规则是相同的。

于 2014-08-08T20:49:51.657 回答
-5

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

于 2011-05-02T13:20:23.347 回答