[英]Why does decay to pointer for array argument appear not to apply to sizeof()?
[英]Why does a C array decay to a pointer when passed with size
我理解為什么數組在傳遞給函數時未指定其大小就衰減為指針,例如:
void test(int array[]);
為什么在傳遞大小時這樣做呢? 例如。
void test(int array[3]);
我在后一個函數簽名下使用sizeof
遇到了麻煩,這很令人沮喪,因為在編譯時很清楚地知道了數組的長度。
void test(int* array);
void test(int array[]);
void test(int array[3]);
所有這些變體都是相同的。 C僅允許您使用其他拼寫,但即使最后顯式標注了數組大小的最后一個變體也會衰減為指向第一個元素的指針。
也就是說,即使使用最后一個實現,您也可以使用任意大小的數組調用該函數:
void test(char str[10]) { }
test("test"); // Works.
test("let's try something longer"); // Still works.
沒有神奇的解決方案,處理該問題的最易讀的方法是使用數組+ size創建struct
,或者簡單地將size作為附加參數傳遞給函數。
LE:請注意,此轉換僅適用於數組的第一維。 當傳遞給函數時, int[3][3]
會轉換為int (*)[3]
,而不是int **
。
因為您將無法正確調用此類函數。 在幾乎所有情況下,數組都會衰減為指向第一個元素的指針,並且在任何調用該函數的嘗試中,數組都會首先轉換為指針,並且該調用將是不匹配的。 當陣列不衰減的唯一上下文是運營商sizeof
, _Alignof
, _Alignas
和&
。 這些在語法上更容易檢測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.