You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中使用Union类型成员时输出异常的原因咨询

联合体内存共享导致的数值异常解析

让我来帮你理清这个问题的来龙去脉——这完全是联合体(union)的核心特性——内存共享引发的,咱们一步步拆解:

首先先把你的代码贴出来方便分析:

#include<stdio.h>
union U{
    int x;
    char y;
};
int main() {
    union U u1;
    u1.x = 258;
    u1.y = '0';
    printf("%d%d",u1.x,u1.y);
    return 0;
}

关键前提:联合体的本质

联合体的所有成员都共享同一块连续的内存空间,也就是说,u1.x和u1.y从同一个内存地址开始存储。修改其中一个成员,会直接覆盖另一个成员对应位置的内存内容。另外,咱们默认是小端字节序(绝大多数现代计算机系统都是这个字节序,低字节存在内存低地址)。

步骤1:u1.x = 258的内存布局

这里要注意:你的编译环境中int应该是2字节(有些老平台或特定编译器下int是2字节)。258的十六进制是0x0102,按照小端字节序,内存中存储顺序是低字节在前:

  • 内存低地址(也就是u1.y对应的1字节空间):0x02(十进制2)
  • 内存高地址:0x01(十进制1)

步骤2:u1.y = '0'修改内存

字符'0'的ASCII码是48(十六进制0x30),因为y是char类型(占1字节),它会直接覆盖联合体内存的低地址字节(也就是刚才存0x02的位置)。此时联合体的内存变成:

  • 低地址字节:0x30(十进制48)
  • 高地址字节:还是0x01(十进制1)

步骤3:最终输出的计算

现在看两个输出值:

  1. u1.x:把2字节的内存按小端拼接成int,就是0x0130,转换成十进制是 1*256 + 48 = 304
  2. u1.y:直接取对应的1字节内容,就是ASCII码48

所以printf("%d%d",u1.x,u1.y)会把两个数值连起来输出,也就是304+48=30448,这就是你看到的结果。

为什么不符合预期?

你可能误以为联合体的成员是像结构体那样独立分配内存的,但实际上联合体是共享内存的——修改y相当于直接修改了x的低字节,自然会改变x的最终值。

内容的提问来源于stack exchange,提问作者Bhanu Teja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:52:34