union MyUnion {
short n1; // 2 bytes
int n2; // 4 bytes
double n3; // 8 bytes
};
printf("%u, %u\n", sizeof(union MyUnion), sizeof(double)); // 輸出 8, 8
union MyUnion {
unsigned char n1; // 1 byte
unsigned short n2; // 2 bytes
unsigned int n3; // 4 bytes
} U = {0};
U.n2 = USHRT_MAX; // 0xFFFF
// n1 = 0xFF (低位), n2 = 0xFFFF, n3 = 0x0000FFFF
U.n3 = UINT_MAX; // 0xFFFFFFFF
// n1 = 0xFF, n2 = 0xFFFF, n3 = 0xFFFFFFFF
U.n1 = 0; // 低位清零
// n1 = 0x00, n2 = 0xFF00, n3 = 0xFFFFFF00
直觀展示了小端序架構下低位優先佈局,以及成員間相互覆蓋效應。
結合 enum 標識當前有效類型,實現「標籤聯合體」(Tagged Union / Discriminated Union),是 C 語言模擬代數數據類型的標準模式。
enum UnionType { SHORT, INT, FLOAT };
struct Rec {
unsigned ID;
enum UnionType type; // 標識當前有效成員
union {
short s;
int i;
float f;
} u;
} R[4];
// 賦值
R[0] = (struct Rec){1, SHORT, {.s = 123}};
R[1] = (struct Rec){2, INT, {.i = 12345}};
R[2] = (struct Rec){3, FLOAT, {.f = 3.14}};
R[3] = (struct Rec){4, INT, {.i = 54321}};
// 類型安全訪問
for (size_t i = 0; i < 4; i++) {
switch (R[i].type) {
case SHORT: printf("%u: %hd\n", R[i].ID, R[i].u.s); break;
case INT: printf("%u: %d\n", R[i].ID, R[i].u.i); break;
case FLOAT: printf("%u: %g\n", R[i].ID, R[i].u.f); break;
}
}
| 特性 | 結構體 struct | 聯合體 union |
|---|---|---|
| 內存佈局 | 成員順序排列,互不重疊 | 成員完全重疊,共享起始地址 |
| 大小 | ≥ 所有成員大小之和(含對齊填充) | = 最大成員大小(含對齊) |
| 同時有效成員 | 所有成員 | 僅一個 |
| 典型用途 | 聚合相關數據 | 節省空間、類型懲罰、硬件寄存器映射 |
float 查看 int 位模式),需注意嚴格別名規則。union { ... };,成員可直接訪問 s.u → s.s。聯合體通過內存共享實現空間複用與類型重新解讀,是 C 語言底層編程的利器。配合標識枚舉構成標籤聯合體,可在保證類型安全前提下實現異構數據統一存儲,是系統級開發、嵌入式編程、協議解析的核心技術。