sizeof(a++) 不會真正執行 a++。void fun(int arr[10]) {
printf("fun: %zu\n", sizeof(arr)); // 輸出 4/8 (指針大小)
}
int main() {
int arr[10];
printf("main: %zu\n", sizeof(arr)); // 輸出 40 (10*4)
fun(arr);
}
鐵律:數組作函數參數傳遞時退化為指針,sizeof 失去長度信息。解決方案:額外傳長度、結構體封裝、C99 變長數組(VLA)。
short a = 0;
printf("%zu\n", sizeof(a++)); // 輸出 2 (short 大小)
printf("%d\n", a); // 輸出 0 (a 未遞增)
int arr[10];
int *p = arr; // arr 退化為首元素地址 &arr[0]
int (*q)[10] = &arr; // &arr 類型為 int(*)[10],數組整體地址
printf("%p\n", arr); // 0x7fff...
printf("%p\n", &arr); // 0x7fff... (數值相同,類型語義不同)
printf("%p\n", p+1); // 0x7fff... + 4 (sizeof(int))
printf("%p\n", q+1); // 0x7fff... + 40 (sizeof(int[10]))
關鍵差異:p+1 步長為元素大小,q+1 步長為整個數組大小。這是二維數組指針遍歷的基礎。
| 表達式 | 類型 | sizeof 結果 | +1 步長 |
|---|---|---|---|
| arr | int* (退化) | 整個數組字節數 | sizeof(int) |
| &arr | int(*)[10] | 整個數組字節數 | 整個數組字節數 |
| *arr / arr[0] | int | sizeof(int) | N/A |