sizeof 是**編譯期操作符**,非函數,單位為字節 (char 大小)。
sizeof(int)、sizeof(int[10]) 需括號。sizeof a、sizeof a+1 (解析為 (sizeof a)+1) 不需括號。sizeof(a++) 不會執行 a++,a 值不變。void fun(int arr[10]) {
printf("%zu\n", sizeof(arr)); // 輸出 4/8 (指針大小),非 40
}
int main() {
int arr[10];
fun(arr); // 4/8
printf("%zu\n", sizeof(arr)); // 40 (此處 arr 為陣列類型)
return 0;
}
sizeof(a++) 不求值short a = 0;
printf("%zu\n", sizeof(a++)); // 2 (short大小)
printf("%d\n", a); // 0 (a未增)!
int arr[10];
printf("%p\n", arr); // &arr[0] 首元素地址
printf("%p\n", &arr); // 陣列地址 (類型 int(*)[10])
// 數值相同,類型語義不同!
int *p = arr; // p+1 跳 4 字節
int (*q)[10] = &arr; // q+1 跳 40 字節 (整個陣列)
sizeof(struct) 可能大於成員大小之和 (填充位)。malloc(n * sizeof(*ptr)) 比 malloc(n * sizeof(Type)) 更易維護。sizeof(vla) 在**運行期**求值 (C99)。