Back to Blog

【面试】联合体内存表示

代码拆解

  1. union{int i; char x[2];} a; 定义了一个匿名联合体变量 a,它拥有两个成员:

    • i:一个 4 字节(在大多数平台上)的 int
    • x[2]:长度为 2 的字符数组,占用 2 字节。
  2. a.x[0] = 10; a.x[1] = 1; 把数组的两个字节分别写入 低地址高地址

  3. printf("%d", a.i); 读取同一块内存,但以 int 形式解释。

为什么输出 266

在小端序机器上,a.x[0] 位于 最低地址,对应整数的 低位字节a.x[1] 位于 次低地址,对应整数的 次低位字节。于是内存布局如下(仅展示前两字节,后两字节未被显式赋值,通常为 0):

地址内容
00x0A (10)
10x01 (1)
20x00
30x00

把这四个字节解释为一个 32 位整数得到 0x0000010A,十进制是 266。这正是面试答案所给的结果。

关键点char 类型的数组在联合体中仍然遵循同样的字节序规则,低位对应低地址。


3. 示例 2:联合体中嵌套结构体的使用