【面试】联合体内存表示
代码拆解
-
union{int i; char x[2];} a;定义了一个匿名联合体变量a,它拥有两个成员:i:一个 4 字节(在大多数平台上)的int。x[2]:长度为 2 的字符数组,占用 2 字节。
-
a.x[0] = 10; a.x[1] = 1;把数组的两个字节分别写入 低地址 和 高地址。 -
printf("%d", a.i);读取同一块内存,但以int形式解释。
为什么输出 266
在小端序机器上,a.x[0] 位于 最低地址,对应整数的 低位字节;a.x[1] 位于 次低地址,对应整数的 次低位字节。于是内存布局如下(仅展示前两字节,后两字节未被显式赋值,通常为 0):
| 地址 | 内容 |
|---|---|
| 0 | 0x0A (10) |
| 1 | 0x01 (1) |
| 2 | 0x00 |
| 3 | 0x00 |
把这四个字节解释为一个 32 位整数得到 0x0000010A,十进制是 266。这正是面试答案所给的结果。
关键点:
char类型的数组在联合体中仍然遵循同样的字节序规则,低位对应低地址。