我有以下结构,我想将其初始化为零。
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,包括不属于任何成员(填充(的位。
后者只能保证将实际成员设置为零,因此它可能更快,因为它有机会接触更少的内存。