union 是一種特殊的構造類型,允許在同一塊內存空間中存儲不同類型的數據(但同一時刻只能存儲其中一個)。其大小由最大成員決定,所有成員從低地址起始存放,實現「以空間換靈活」或「類型雙關」目的。
union Data {
char c;
int a;
int b;
} demo; // 直接定義變量
// 或分離聲明
union Data { char c; int a; int b; };
union Data demo;
sizeof(demo) == sizeof(int) == 4(假設 int 4 字節),而非成員大小之和。
demo.c = 'H'; // 0x48 demo.a = 10; // 0x0000000A 覆蓋前 4 字節 demo.b = 12; // 0x0000000C 再次覆蓋 // 此時 demo.c 讀出為 12 (0x0C),demo.a/demo.b 均為 12
若 char c (1B) 與 int a (4B) 共用:
c 僅修改最低 1 字節,a 高 3 字節保持不變。a 會完全覆蓋c。此特性常用於大小端檢測、位域操作、網絡協議報文解析。
無對齊填充,&demo.c == &demo.a == &demo.b == &demo。
#include#include typedef union { char c; int a; int b; } Demo; int main() { Demo d; d.c = 'H'; // 0x48 d.a = 10; // 0x0000000A d.b = 12; // 0x0000000C printf("Size: %zu\n", sizeof(d)); // 4 printf("Values: %c %d %d\n", d.c, d.a, d.b); // 12 12 12 (ASCII 12 為控制字符) return 0; }

| 場景 | 說明 |
|---|---|
| 協議報文解析 | 同一字節流按不同結構體/union 解析頭部/負載 |
| 大小端檢測 | union {int i; char c[4];} u; u.i=1; u.c[0]==1 為小端 |
| 類型雙關優化 | 浮點數位操作:union {float f; uint32_t u;} 避免指針轉換違反嚴格別名規則 |
| 節省內存 | 互斥狀態數據(如事件類型+負載)共用存儲 |
union 是 C 標準允許的類型雙關方式,禁止 用指針強轉(如 *(int*)&f)訪問不同類型對象,屬於未定義行為。