以此代码段为例:
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上得到垃圾.
你能解释一下为什么会这样吗?联合中未使用的变量究竟发生了什么?
如果b
是int
,则printf("%d",overflow.b);
给出值5.这是为什么?
在联盟中,所有成员共享相同的内存.分配给时.a
,您正在将int值写入内存.当您访问时.b
,您正在将您刚写入int的相同字节解释为float.
当成员的大小不同时(如int和float可能),则会更改某些字节而其他字节则不会更改.在查看较大的成员时,您可能正在访问未初始化的内存.
在联合中没有"未使用的变量",只是对公共内存的未使用的解释.
当你创建b
一个int时,你说.a
应该将字节解释为int,并且.b
还应该将字节解释为int.换句话说,将同一个union的两个成员声明为相同类型是没用的.
归档时间: |
|
查看次数: |
203 次 |
最近记录: |