C99標準說,在6.7.5.3/7以下:我可以在C99中使用數組作爲函數參數嗎?
一個參數作爲「」「類型的數組」的聲明,應調整至「」合格指針 類型「」,其中類型限定符(如果有)是在數組類型派生的[和]中指定的那些。
我的理解是:
void foo(int * arr) {} // valid
void foo(int arr[]) {} // invalid
然而,GCC 4.7.3會很樂意接受這兩個函數定義,即使與gcc -Wall -Werror -std=c99 -pedantic-errors
編譯。由於我不是C專家,我不確定我是否可能誤解了標準的內容。
我也注意到,
size_t foo(int arr[]) { return sizeof(arr); }
總是返回的sizeof(int *)
代替數組大小,這公司我相信int arr[]
作爲int *
處理和gcc只是試圖讓我感覺更舒服。
有人可以解釋一下這個問題嗎?僅供參考,此問題源自this comment。
編譯器正在執行C99 std引用的說法:它將'[]'形式調整爲'*'形式。因此這兩者是等同的。幾乎沒有辦法將整個數組按值傳遞給C函數。您只能傳遞一個指針並在函數體內手動創建副本。例外情況是,記錄中的數組字段將在按值傳遞時與記錄一起傳遞。因此,您有時會看到一個數組字段的記錄,其中記錄僅僅是包裝數組以獲得此效果。 – Gene
@Gene D'uh,我犯了一個錯誤,把這個標準的段落作爲對C程序員的指令,而不是C編譯器。愚蠢的我。 – nijansen