在下面的代码中,是否可以预测 int 的值(如何?),还是只是垃圾?
union a
{
int i;
char ch[2];
};
a u;
u.ch[0] = 0;
u.ch[1] = 0;
cout<<u.i;
}
我会说这取决于 和 的int
大小char
。Aunion
包含最大变量的内存。如果int
是 4 个字节并char[2]
表示 2 个字节,则int
消耗的内存比char
-array 多,因此您不会int
通过设置所有 -variables 来将完整的 -memory 初始化为 0 char
。这取决于您的内存初始化机制,但基本上 的值int
似乎是随机的,因为额外的 2 个字节填充了未指定的值。
此外,在我看来,填充 a 的一个变量union
并读取另一个变量正是使联合不安全的原因。
如果您确定这是最大的数据类型,则可以通过编写int
来初始化整体union
union a
{
int i;
char ch[2];
};
void foo()
{
a u = { 0 }; // Initializes the first field in the union
cout << u.i;
}
因此,将最大的类型放在联合的开头可能是个好主意。尽管不能保证当所有位都设置为 0 时所有数据类型都可以被视为零或空。