sizeof 是 C 語言的單目運算子 (非函式),在 編譯期 計算運算元的位元組大小,回傳型別為 size_t (無號整數)。正確理解 sizeof 對記憶體管理、結構體對齊、跨平台移植至關重要。
sizeof(type) // 型別需加括號
sizeof expression // 運算式可不加括號
sizeof variable // 變數可不加括號
注意:sizeof int 是錯誤的,必須寫 sizeof(int)。
| 類別 | 規則 / 大小 (典型 64 位系統) |
|---|---|
| 基本型別 | char=1, short=2, int=4, long=8, float=4, double=8, long double=16 |
| 指標 | 固定 8 位元組 (64 位系統),與指向型別無關 |
| 陣列 | 總位元組數 = 元素個數 × 元素大小。不退化為指標 |
| 結構體/聯合 | 含對齊填充位元組。聯合取最大成員大小 |
| 函式參數陣列 | 退化為指標,sizeof 回傳指標大小 (8) |
void func(int arr[10]) {
// 這裡 arr 是指標,非陣列!
printf("%zu\n", sizeof(arr)); // 輸出 8 (指標大小),非 40
}
解決:傳遞陣列大小作為額外參數,或使用結構體包裹陣列。
struct A { char c; int i; }; // 大小 8 (c+3填充+i)
struct B { int i; char c; }; // 大小 8 (i+c+3填充)
struct C { char c; double d; }; // 大小 16 (c+7填充+d)
原則:成員偏移量為其大小倍數;結構體總大小為最大成員大小倍數。可用 #pragma pack(n) 或屬性 `__attribute__((packed))` 壓縮對齊。
sizeof(arr) / sizeof(arr[0])malloc(n * sizeof(*ptr)) — 變更型別時無需修改 sizeof 參數。char buf[sizeof(struct Header)];int n = 10;
int arr[n]; // 合法
printf("%zu\n", sizeof(arr)); // 執行期計算,輸出 40
注意:VLA 不可為 static/extern,大小受限於堆疊空間,現代 C 標準 (C11) 將其列為可選特性,建議謹慎使用。