跳转至

联合

与封装多块相关数据的结构不同,联合包含一块通过多个变量暴露的数据。联合遵循三条规则:

(cid:127)联合在内存中的大小等于其最大成员的大小。

(cid:127)联合的成员都引用同一块内存。

(cid:127)联合继承其最大成员的对齐方式。

下面代码中的 printf() 调用有助于说明前两条规则:

union {
    BYTE byteValue;
    struct {
        WORD first;
        WORD second;
    } words;
    DWORD value;
} dwValue;
dwValue.value = 0xDEADBEEF;
printf("Size %d\nAddresses 0x%x,0x%x\nValues 
0x%x,0x%x\n",
    sizeof(dwValue), &dwValue.value, 
&dwValue.words,
    dwValue.words.first, dwValue.words.second);

这次对 printf() 的调用输出以下内容:

Size 4
Addresses 0x2efda8,0x2efda8
Values 0xbeef,0xdead

第一条规则由首先打印的 Size 值说明。尽管 dwValue 有三个总共占用 9 字节的成员,但它的大小只有 4 字节。大小结果也验证了第二条规则,因为 dwValue.value 和 dwValue.words 都指向地址 0x2efda8,正如「地址」后打印的值所示。第二条规则也由 dwValue.words.first 和 dwValue.words.second 包含 0xbeef 和 0xdead(在「值」后打印)这一事实验证,考虑到 dwValue.value 是 0xdeadbeef,这是合理的。第三条规则在这个示例中没有演示,因为我们没有足够的内存上下文,但如果你把这个联合放进结构里,用你喜欢的任何类型包围它,它实际上总会像 DWORD 一样对齐。