| 特性 | 結構體 struct | 聯合體 union |
|---|---|---|
| 內存大小 | 所有成員大小之和(含填充對齊) | 最大成員大小(含對齊) |
| 存儲方式 | 成員依次佔用不同內存區域 | 所有成員共享同一塊內存 |
| 同時有效成員 | 所有成員 | 同一時刻僅一個成員有效 |
| 初始化 | 可初始化任意/所有成員 | 僅能初始化第一個成員 |
#include\ union data {\ int a;\ float b;\ double c;\ char d;\ } m;\ struct stud {\ int a;\ float b;\ double c;\ char d;\ };\ int main() {\ struct stud student;\ printf("%d, %d\\n", sizeof(struct stud), sizeof(union data));\ return 0;\ }
15, 8
int(4) + float(4) + double(8) + char(1) = 17,但編譯器對齊到 8 字節邊界,char 後填充 7 字節,實際佔 24?示例輸出 15,說明環境為 float=4, double=8, int=4, char=1,無額外填充(或壓縮屬性)。double 佔 8 字節,故 sizeof(union data) = 8。union {\
unsigned int i;\
char c;\
} test;\
test.i = 0x01020304;\
// 小端機器:test.c == 0x04 (最低位在最低地址)\
// 大端機器:test.c == 0x01 (最高位在最低地址)
union UART_REG {\
uint32_t word;\
struct {\
uint32_t TX_EN : 1;\
uint32_t RX_EN : 1;\
uint32_t PARITY : 2;\
uint32_t RESERVED : 28;\
} bits;\
};\
// 整字寫入:reg.word = 0x3;\
// 位級讀寫:reg.bits.TX_EN = 1;\
sizeof。結構體用於聚合異構數據,聯合體用於同一內存的多重解釋(類型雙關、硬件映射、互斥字段節省空間)。理解內存佈局差異,是編寫正確、高效、可移植 C 代碼的關鍵。