| 特性 | 結構體 | 聯合體 |
|---|---|---|
| 記憶體分配 | 所有成員同時存在,總大小 = 成員大小之和(含對齊填充) | 所有成員共用同一塊記憶體,大小 = 最大成員大小(含對齊) |
| 成員存取 | 可同時讀寫多個成員,互不干擾 | 同一時刻只能存取一個成員,寫入新成員會覆蓋舊值 |
| 初始化 | 可指定多個成員 | 僅能初始化第一個成員 |
| 典型用途 | 邏輯相關的資料聚合 | 型別轉換、節省記憶體、互斥資料欄位 |
struct Demo {
char c; // offset 0, size 1
// padding 3 bytes (alignment)
int i; // offset 4, size 4
double d; // offset 8, size 8
}; // total 16 bytes (alignment to 8)
union Demo {
char c; // offset 0
int i; // offset 0
double d; // offset 0
}; // total 8 bytes (max member size, aligned)
#include
int main(void) {
union {
int i;
struct {
char first;
char second;
} half;
} number;
number.i = 0x4241; // 0x42='B', 0x41='A' (little-endian)
printf("%c%c\n", number.half.first, number.half.second); // 輸出: AB
number.half.first = 'a'; // 0x61
number.half.second = 'b'; // 0x62
printf("%x\n", number.i); // 輸出: 6261 (little-endian: 0x6261)
return 0;
}
解析:
i 時,低位元組對應 first、次低位元組對應 second(小端序)first/second 時,i 的低兩位元組同步改變
typedef enum { TYPE_INT, TYPE_FLOAT, TYPE_STR } DataType;
typedef struct {
DataType type; // 標籤:指明當前有效成員
union {
int i;
float f;
char *s;
} value;
} Variant;
void printVariant(Variant *v) {
switch (v->type) {
case TYPE_INT: printf("int: %d\n", v->value.i); break;
case TYPE_FLOAT: printf("float: %f\n", v->value.f); break;
case TYPE_STR: printf("str: %s\n", v->value.s); break;
}
}
這是 C 語言實現「代數資料型別」的標準模式,廣泛用於解析器、虛擬機、訊息協定。
sizeof(union) 受最嚴格對齊要求的成員影響結構體與聯合體是 C 語言「組合型別」的兩面:結構體代表並存,聯合體代表互斥/重疊。理解記憶體佈局差異,配合標籤欄位實現安全的變體型別,是系統程式設計、協定解析、嵌入式開發的核心技能。