例如
union
{
int n;
void *p;
} u;
un或up的初始值等于0吗?
应该注意的是,NULL指针不一定存储在全零位中。因此,即使un和up的大小相同,
u.n == 0
不保证
u.p == 0
反之亦然。
(对不起,我的英语不好)
由于u
是静态的,则第一构件将被初始化为zero
,从C99草案标准部分6.7.8
初始化段10:
如果未自动初始化具有自动存储期限的对象,则其值不确定。如果具有静态存储持续时间的对象未显式初始化,则:
—如果具有指针类型,则将其初始化为空指针;
—如果具有算术类型,则将其初始化为(正数或无符号)零;
—如果是聚合,则根据这些规则(递归)初始化每个成员;
—如果它是联合,则将根据这些规则初始化(递归)第一个命名成员。
由于n
是arithmetic type
,它将被初始化为zero
。的值p
未指定,但实际上编译器通常支持类型punning,例如gcc手册中的Type- punning,我们可以在-fstrict-aliasing部分看到以下内容:
从不同于最近写过的工会会员(称为“打字手法”)的成员中读取信息的做法很常见。即使使用-fstrict-aliasing,只要通过联合类型访问内存,也可以进行类型修剪。
还值得注意的是,您may
可以像这样初始化联盟的任何成员:
union { int n; void *p; } u = { .p = NULL } ;
^^^^^^^^^^^^^
我不确定是否所有编译器都支持此功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句