void Func(char str[100]) {
sizeof(str) = ? // ①
}
void *p = malloc(100);
sizeof(p) = ? // ②
① 4 (32 位系統) / 8 (64 位系統)
② 4 (32 位系統) / 8 (64 位系統)
| 語境 | 陣列名代表 | sizeof 結果 | 可修改? |
|---|---|---|---|
定義處 char str[100]; | 資料結構本身 (char[100]) | 100 | 否 (常量指標) |
| sizeof(str) / &str | 資料結構本身 | 整個陣列大小 | 否 |
函式參數 Func(char str[100]) | 退化為 普通指標 (char*) | 指標大小 (4/8) | 是 (可 ++、--、賦值) |
| 其他表達式 | 轉換為指向首元素指標 (char*) | 指標大小 | 否 |
malloc 回傳 void*,賦值給 void *p。sizeof(p) 為指標變數本身大小,與分配記憶體大小無關。
size_t len 參數。sizeof 是編譯期運算子,非函式,不產生機器碼(VLA 例外)。sizeof(陣列參數) = 指標大小;sizeof(malloc指標) = 指標大小。牢記「陣列名作參數退化為指標」鐵律,即可秒殺此類面試題。