以此代码段为例:
union stack {
int a;
float b;
};
union stack overflow;
overflow.a = 5;
当我做printf("%d",overflow.b);
时,我在gcc和turbo上都得到零。
当我做printf("%f",overflow.b);
时,我在gcc上得到零,在turbo上得到垃圾。
你能解释一下为什么会这样吗? 联合中未使用的变量究竟发生了什么?
如果b
是int
,printf("%d",overflow.b);
会给出值5.为什么会这样?
答案 0 :(得分:6)
在联盟中,所有成员共享相同的内存。分配给.a
时,您正在将int值写入内存。当您访问.b
时,您正在将您刚写入int的相同字节解释为float。
当成员的大小不同时(可能是int和float),则会更改某些字节,而其他字节则不会。在查看较大的成员时,您可能正在访问未初始化的内存。
在联合中没有“未使用的变量”,只是对公共内存的未使用的解释。
当你使b
为int时,你说.a
应该将字节解释为int,而.b
也应该将字节解释为int。换句话说,将同一个union的两个成员声明为相同类型是没用的。
答案 1 :(得分:1)
printf("%d",overflow.b);
是UB(printf中格式说明符不正确)。
printf("%f",overflow.b);
是UB(尚未分配overflow.b
)。工会成员都拥有相同的空间。两者在内存中都有不同的表示形式(一个是int
,另一个是float
)。分配给一个并尝试访问第二个肯定是UB
答案 2 :(得分:0)
如果您将a
设置为某个内容,则b
的一部分将是该内容,但b
的一部分可能是未初始化的数据,具体取决于系统上的sizeof int和float。将其解释为浮动,谁知道会发生什么?鼻子恶魔。不要这样做。