sizeof 是編譯時單目操作符(非函數),以字節為單位返回操作數的存儲大小。不計算表達式值,僅推導類型。
sizeof(int) // 類型需加括號 sizeof variable // 變量可省略括號 sizeof expression // 表達式推導類型,不求值
| 場景 | 結果 | 說明 |
|---|---|---|
| 基本類型 | 實現定義 | 如 int 常為 4,char 必為 1 |
| 數組 | 總字節數 | char a[6] → 6 |
| 指針 | 指針大小 | 32位=4,64位=8,**非所指對象大小** |
| 結構體 | 含對齊填充 | 可能大於成員總和 |
| 字符串字面量 | 含結束符 | sizeof("abc") == 4 |
void func(char arr[]) { // 實際是 char *arr
printf("%zu\n", sizeof(arr)); // 輸出 4 或 8(指針大小),非數組長度
}
int main() {
char a[6] = "hello";
printf("%zu\n", sizeof(a)); // 6
func(a); // 4/8
return 0;
}
對策: 函數參數傳遞數組時,**必須額外傳遞長度**。
char *p = "hello"; // 指向只讀區,sizeof(p)=指針大小 char a[] = "hello"; // 棧上數組,sizeof(a)=6
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]))(僅適用於作用域內的數組)struct { int len; char data[]; } 配合 malloc(sizeof(struct) + n)sizeof 表達式不求值:sizeof(i++) 不會改變 isizeof 是編譯期類型查詢工具,**數組退化為指針**是最大陷阱。牢記:只有在數組定義的作用域內,sizeof 才返回整個數組大小;傳遞函數、賦值給指針後均退化。善用 ARRAY_SIZE 宏、柔性數組、結構體對齊知識,編寫健壯的底層代碼。