union a
{
int x;
char a[2];
}
如果我们为x分配512值并尝试打印[0]和[1]那么输出将是什么 请解释一下怎么样?
答案 0 :(得分:5)
根据标准,写入联盟的一个成员,然后从另一个成员读取的结果没有定义。几乎任何事情都可能发生。
实际上,如果你在小端机器上运行代码,[0]可能是0,而[1]可能是2.在16位大端机器上,[0]将是2和a [1]将是0.在32位大端机器上,(不存在,因为你定义的东西)a [2]将是2,并且a [0],a [1 ],& a [3]将为0。
答案 1 :(得分:3)
我取决于平台的字节顺序。在小端平台(Intel)上,[0]将具有整数的最低有效字节(4个字节),因此[0]将保持0x00和[1] 0x02
答案 2 :(得分:1)
这取决于您运行它的计算机的字节顺序:
union实际上对你的int和你的字符使用相同的内存,所以,
int 512 (ie 0x200) char[4] 0x00 0x00 0x02 0x00 little endian, so a[0]=0, a[1]=0 char[4] 0x00 0x02 0x00 0x00 big endian , so a[0]=0, a[1]=2
(实际上,我可能会错误地使用小端和大端)
答案 3 :(得分:0)
C中的联合共享相同的内存空间,即x和a [2]都从相同的内存位置开始。将值分配给其中一个时,另一个会被覆盖。
在你的情况下,当你为x分配512时,你也会将它的字节写入char,就像FernandoMiguélez刚刚解释的那样......