关于Union的未使用领域

n0n*_*hun 3 c unions

以此代码段为例:

union stack {
    int a;
    float b;
};

union stack overflow;
overflow.a = 5;
Run Code Online (Sandbox Code Playgroud)

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

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

如果bint,则printf("%d",overflow.b);给出值5.这是为什么?

Ned*_*der 6

在联盟中,所有成员共享相同的内存.分配给时.a,您正在将int值写入内存.当您访问时.b,您正在将您刚写入int的相同字节解释为float.

当成员的大小不同时(如int和float可能),则会更改某些字节而其他字节则不会更改.在查看较大的成员时,您可能正在访问未初始化的内存.

在联合中没有"未使用的变量",只是对公共内存的未使用的解释.

当你创建b一个int时,你说.a应该将字节解释为int,并且.b还应该将字节解释为int.换句话说,将同一个union的两个成员声明为相同类型是没用的.