在C中将结构归零存储区

时间:2018-09-18 08:45:21

标签: c struct memset

我具有以下结构,我想将其初始化为零。

struct example {
     int a;
     int b;
     char c;
};
struct example mystruct;

我可以通过以下方式将mystruct设置为零:

memset(&mystruct, 0, sizeof(mystruct));

mystruct = (struct example) {0};

第二种方法等于第一种吗?

请注意,我不仅要在变量定义中将mystruct变量初始化为零,还可能要重用它。

2 个答案:

答案 0 :(得分:3)

嗯,在您的情况下,它们是等效的(忽略填充字节)。

引用C11,第§6.7.9/ P21,(强调我的

  

如果括号括起来的列表中的初始化程序少于元素或成员   的总和,或者用于初始化已知数组的字符串文字中的字符较少   如果大小大于数组中的元素,则聚合的余数应为   初始化与具有静态存储持续时间的对象相同。

,关于静态存储持续时间对象的初始化,P10(再次是强调矿山)

  

[...]如果未初始化具有静态或线程存储持续时间的对象   明确地,然后:

     

-如果具有指针类型,则将其初始化为空指针;

     

如果具有算术类型,则将其初始化为(正数或无符号)零;

     

如果是聚合,则根据这些规则(递归地)初始化每个成员,   并将所有填充都初始化为零位;

     

-如果是一个联合,则根据以下内容(递归)初始化第一个命名成员   规则,并且任何填充都初始化为零位;


为完整性起见,如below comment by Serge Ballesta中所述:

  

所有剩余成员将隐式初始化为具有静态存储持续时间的对象。而且该标准对顶层对象的填充位没有强制要求

这表示对于第一个对象/成员,分配值与memset()调用的填充值不同。

答案 1 :(得分:1)

No, they are not equal.

The first is more low-level, it will set all bits of the value to 0, including those that are not part of any member (padding).

The latter is only guaranteed to set the actual members to zero, so it might be faster since it has the opportunity to touch less memory.