聯合體 union 讓多個成員共用同一塊記憶體,是檢測系統大小端、型別雙關、省記憶體的利器。本文詳細對比 union 與 struct 記憶體模型,並以實測代碼證明 x86 小端模式特性。
| 特性 | struct | union |
|---|---|---|
| 成員儲存 | 各自獨立空間,依宣告順序排列 | 完全重疊,共用同一起始位址 |
| 總大小 | 所有成員大小之和(含對齊填充) | 最大成員的大小(對齊至最大對齊需求) |
| 存取語意 | 同時存在所有成員 | 同一時間只能有效存取一個成員 |
| 典型用途 | 資料聚合、記錄 | 型別轉換、省記憶體、硬體暫存器映射 |
#include <stdio.h>
union UnionTest {
int a; // 4 bytes
double b; // 8 bytes
};
int main() {
union UnionTest test;
printf("sizeof(test) = %zu\n", sizeof(test)); // 輸出 8
return 0;
}
結果證明:union 大小 = 最大成員大小 (對齊後)。
#include <stdio.h>
union EndianTest {
char c[4]; // 4 個位元組
int i; // 1 個 32 位整數
};
int main() {
union EndianTest data;
data.c[0] = 0x04; // 低位址
data.c[1] = 0x03;
data.c[2] = 0x02;
data.c[3] = 0x11; // 高位址
// 記憶體由低址到高址:04 03 02 11
printf("0x%08x\n", data.i); // 以整數方式讀取
return 0;
}
0x11020304(低位元組儲存在低位址)0x04030211(高位元組儲存在低位址)x86/x64、ARM (預設) 皆為小端模式;網路傳序為大端模式,需用 htonl/ntohl 轉換。
char buf[] 接收原始位元組,struct Header h 直接存取欄位char* 外,不同型別指標不得指向同一記憶體,union 是合法例外htonl/ntohl 或序列化庫處理端序,避免直接依賴 union 型別雙關深入理解 union 記憶體佈局與端序,是系統程式設計、嵌入式開發、網路協定實作的核心基本功。