将 C 中结构的内存区域归零



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

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

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

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

mystruct = (struct example) {0};

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

请注意,我不仅想在变量定义时将 mystruct 变量初始化为零,也许是为了重用它。

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

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

如果大括号括起来的列表中的初始值设定项少于元素或成员的数量 聚合,或字符串文本中用于初始化已知数组的字符较少 大小比数组中有元素,聚合的其余部分应 隐式初始化与具有静态存储持续时间的对象相同。

并且,关于静态存储持续时间对象的初始化,P10(再次强调我的(

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

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

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

如果它是一个聚合,则根据这些规则(递归地(初始化每个成员, 并且任何填充都初始化为零位;

— 如果它是一个联合,则根据这些初始化(递归(第一个命名成员 规则,并且任何填充都初始化为零位;


为了完整起见,正如Serge Ballesta在下面的评论中提到的:

所有剩余成员都将隐式初始化,与具有静态存储持续时间的对象相同。并且该标准没有对顶级对象的填充位进行任何强制要求

这表明,对于填充值,赋值将与第一个对象/成员情况下的memset()调用不同。

不,它们不相等。

第一个是更底层的,它将值的所有位设置为 0,包括不属于任何成员(填充(的位。

后者只能保证将实际成员设置为零,因此它可能更快,因为它有机会接触更少的内存。

最新更新