sizeof 是單目運算子(如 ++、--),**非函數**。它在編譯期由編譯器根據運算元的**型別**計算佔用的**位元組數**,結果型別為 size_t(無號整數)。執行期零開銷。
| 形式 | 範例 | 說明 |
|---|---|---|
| 型別運算元 | sizeof(int) | **必須加括號**。回傳該型別大小,視平台而定(x64 常為 4)。 |
| 運算式/變數運算元 | sizeof arr、sizeof(x+1) | **可省略括號**。依運算式**靜態型別**決議大小,**不評估運算式**。 |
int testSizeOf(char x[]) { return sizeof(x); } // 等價 char *x
int main() {
char y[6];
printf("%d\n", testSizeOf(y)); // 輸出 4/8 (指標大小),而非 6
}
原因:函數參數宣告為陣列會被調整為指標,sizeof 見到的是指標型別。
printf("%zu\n", sizeof("0123456789")); // 輸出 11 (10 字元 + \0)
字串字面常數在記憶體中以 \0 結尾,sizeof 計入此終止符。
struct A { char c; int i; }; // sizeof 通常為 8 (非 5),因 4 位元組對齊
struct B { char c; char d; }; // sizeof 為 2
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
int a[10];
printf("%zu\n", ARRAY_SIZE(a)); // 10
// 注意:不可用於指標參數
#define TYPE_SIZE(x) _Generic((x), \
int: 4, long: 8, float: 4, double: 8, default: 0)
%zu (C99),對應 size_t,避免 %d/%u 截斷警告。#pragma pack 或 _Alignas 控制對齊。malloc(n * sizeof(*ptr)) 比 malloc(n * sizeof(TYPE)) 更易維護(型別變更自動適配)。| 運算元 | 結果 | 備註 |
|---|---|---|
sizeof(int) | 4 | 平台相關 |
sizeof 3.14 | 8 | 預設 double |
sizeof 'a' | 4 | 字元常數為 int |
sizeof "abc" | 4 | 含 \0 |
int a[5]; sizeof(a) | 20 | 完整陣列大小 |
void f(int a[]) { sizeof(a); } | 4/8 | 退化為指標 |
struct {char c; int i;} | 8 | 對齊填充 |
掌握以上核心規則,sizeof 將不再是 Bug 溫床,而是靜態分析與記憶體管理的得力工具。