1
union a
{
 int x;
 char a[2];
}

如果我们为 x 分配 512 值并尝试打印 a[0] 和 a[1] 那么输出将是什么,请解释一下如何?

4

4 回答 4

5

根据标准,写入联合的一个成员,然后从另一个成员读取的结果没有定义。几乎任何事情都可能发生。

实际上,如果您在 little-endian 机器上运行代码,a[0] 可能是 0,a[1] 可能是 2。在 16 位 big-endian 机器上,a[0] 可能是 2并且 a[1] 将为 0。在 32 位大端机器上,(不存在,正如您所定义的那样)a[2] 将为 2,并且 a[0]、a[1] 和 &a [3] 为 0。

于 2010-09-06T07:39:23.117 回答
3

我取决于平台的字节序。在 little-endian 平台 (Intel) a[0] 将具有整数的最低有效字节(4 个字节),因此 a[0] 将保存 0x00 和 a[1] 0x02

于 2010-09-06T07:36:43.103 回答
1

这取决于您运行它的计算机的字节序:

union 实际上为您的 int 和您的 chars 使用相同的内存,因此,

整数 512(即 0x200)
char[4] 0x00 0x00 0x02 0x00 小端,所以 a[0]=0, a[1]=0
char[4] 0x00 0x02 0x00 0x00 大端,所以 a[0]=0, a[1]=2

(实际上,我可能有小端和大端的错误方式)

于 2010-09-06T07:49:46.473 回答
0

C 中的联合共享相同的内存空间,即 x 和 a[2] 都从相同的内存位置开始。当您将值分配给其中一个时,另一个将被覆盖。

在您的情况下,当您将 512 分配给 x 时,您也会将其字节写入 char,就像 Fernando Miguélez 刚刚解释的那样......

于 2010-09-06T07:38:35.410 回答