关于Union的未使用领域

时间:2011-03-06 17:49:31

标签: c unions

以此代码段为例:

union stack {
    int a;
    float b;
};

union stack overflow;
overflow.a = 5;

当我做printf("%d",overflow.b);时,我在gcc和turbo上都得到零。 当我做printf("%f",overflow.b);时,我在gcc上得到零,在turbo上得到垃圾。

你能解释一下为什么会这样吗? 联合中未使用的变量究竟发生了什么?

如果bintprintf("%d",overflow.b);会给出值5.为什么会这样?

3 个答案:

答案 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。将其解释为浮动,谁知道会发生什么?鼻子恶魔。不要这样做。