0

在下面的代码中,是否可以预测 int 的值(如何?),还是只是垃圾?

union a
{
    int i;
    char ch[2];
};
a u;
u.ch[0] = 0;
u.ch[1] = 0;
cout<<u.i;
}
4

1 回答 1

3

我会说这取决于 和 的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 时所有数据类型都可以被视为零或空。

于 2012-08-10T07:49:16.643 回答