我之前听说过关于联合的是它将为其中的最大变量分配内存空间。在这里,我试图分配相同的'价值以两种不同的方式,但最终有问题。
首先,
union h {
int a;
char b;
};
int main()
{
union h h1;
h1.b = 'X';
printf("%d %c\n",h1.a, h1.b );
return 0;
}
输出将是一个很大的随机数,然后是' X'
-1674402216 X
当我尝试将 h1.a 也分配到数字时
union h {
int a;
char b;
};
int main()
{
union h h1;
h1.a = 1;
h1.b = 'X';
printf("%d %c\n",h1.a, h1.b );
return 0;
}
这给出了输出
88 X
有人可以帮我弄清楚究竟发生了什么吗?
谢谢你:)
答案 0 :(得分:4)
联盟成员在内存中占据相同的空间。 所以你的工会看起来像这样:
N-1 ...
--------
N ||X||a||
N+1 | |a||
N+2 | |a||
N+3 | |a||
... | |
--------
...
(假设系统具有32位整数。)
通过分配X,您还修改了未初始化的a的一个字节。您的值(-1674402216)可以在基数16中解释为9C32A658。您的最低有效字节是58 HEX,这是X的ASCII代码,而您的其他三个字节保持其初始未初始化值。
在你的第二种情况下,你首先将int初始化为1(将所有但最不重要的字节设置为0),然后你被X覆盖的最低有效字节在解释为int时得到88(X的ASCII码),并且原始'X',什么时候 看着char成员。
不要忘记提及:这样的布局是实现定义的。标准确实说,正如你在评论中提到的那样,你实际上不应该同时访问最后写的成员,同时,通常的做法是使用它们来完成这一点(参见这个主题:Why do we need C Unions? ,What is the strict aliasing rule?)。