联合体声明中对象值异常咨询:为何z值不符合预期?
问题原因解析
- 联合体的核心特性是所有成员共享同一块内存空间,整个联合体的内存大小等于其最大成员的尺寸(这里
int z占4字节,因此union u1整体为4字节)。 - 当执行
A.x=3时,仅修改了联合体内存的第一个字节(char类型占1字节),剩余3个字节属于未初始化状态,存储的是程序运行时的随机垃圾值。 - 打印
A.y时,short int占2字节,它读取的是内存的前两个字节:第一个字节值为0x03(对应十进制3),第二个字节的垃圾值恰好为0x00,因此y的结果为3。 - 打印
A.z时,int占4字节,它会读取全部4个字节:第一个字节是0x03,后面三个字节的垃圾值组合为0x400000(对应十进制4194304),二者相加得到4194307。
若想让z的值也为3,直接给z赋值即可(A.z=3)。因为联合体中只有最后被赋值的成员能保证其对应的所有内存字节被覆盖,其他成员的值完全依赖当前内存的实际内容,无法保证与已赋值成员一致。
内容的提问来源于stack exchange,提问作者Khaled Adel
相关产品推荐
相关产品推荐

