struct Stu {
char *name;
int num;
int age;
char group;
float score;
};
struct Stu s1, s2;} s1, s2;struct { ... } s1, s2;(無法複用型別)編譯器遵循兩原則:
範例:
struct A { int i; char c; int j; }; // sizeof = 12 (非 9)
struct B { int k; short t; }; // sizeof = 8 (非 6)
struct C { char c1; int i; char c2; }; // sizeof = 12
struct D { char c1; char c2; int i; }; // sizeof = 8 ← 成員重排序省空間
巢狀結構體第一個成員偏移量需對齊到內層最大成員大小整數倍。
struct Stu s = {"Tom", 101, 18, 'A', 92.5}; // 定義時整體初始化
s.age = 19; // 後續只能逐一賦值
printf("%s %d\n", s.name, s.num);
struct Man { char name[20]; int age; };
struct Man m = {"Jack", 30};
struct Man *p = &m;
printf("%s %d\n", m.name, m.age);
printf("%s %d\n", (*p).name, (*p).age);
printf("%s %d\n", p->name, p->age); // 箭號最常用
union Data { int n; char ch; double f; };
union Data u;
u.n = 0x41424344; // u.ch = 'D' (小端模式低位元組)
printf("%zu\n", sizeof(u)); // 8 = max(sizeof(double))
| 特性 | 結構體 | 聯合體 |
|---|---|---|
| 記憶體佈局 | 成員依序排列,互不重疊 | 成員完全重疊 |
| 大小計算 | 含對齊填充,≥ 成員大小總和 | = 最大成員大小(對齊後) |
| 同時有效成員 | 全部 | 僅一個 |
| 典型用途 | 記錄、物件模擬 | 型別雙關、省記憶體、協定解析 |