typedef struct _person {
char firstname;
char lastname;
char *title;
unsigned int age;
char sex;
struct spring ls;
} Person;
結構體大小不是成員大小簡單相加,必須考慮記憶體對齊。最終大小取決於:
#pragma pack、編譯選項)與嵌套結構體 spring 的內部佈局。| 成員 | 偏移 | 大小 | 說明 |
|---|---|---|---|
| firstname | 0 | 1 | char 對齊 1 |
| lastname | 1 | 1 | 緊湊 |
| 填充 | 2 | 6 | 為 title (指標 8 字節) 對齊補齊 |
| title | 8 | 8 | 指標 8 字節對齊 |
| age | 16 | 4 | unsigned int 4 字節對齊 |
| sex | 20 | 1 | char |
| 填充 | 21 | 7 | 為 spring 對齊(假設 spring 含 8 字節成員) |
| ls (spring) | 28 | ? | 視 spring 定義而定 |
總大小 = 最後一個成員結束位置向上取整到最大對齊數(通常 8)的倍數。
#include <stdio.h>
#include <stddef.h>
struct spring { double dummy; }; // 假設含 8 字節成員
typedef struct _person {
char firstname;
char lastname;
char *title;
unsigned int age;
char sex;
struct spring ls;
} Person;
int main() {
printf("sizeof(Person) = %zu\n", sizeof(Person));
printf("offsetof(title) = %zu\n", offsetof(Person, title));
printf("offsetof(ls) = %zu\n", offsetof(Person, ls));
return 0;
}
輸出將隨 spring 定義、編譯器、對齊設定而變化,務必以目標平台實測為準。
#pragma pack(n) 或 C++11 alignas。結構體大小計算是系統級開發基本功,理解對齊規則能避免介面不匹配、緩衝區溢出等隱患。