在C 和C 中,函數簽章可能包含方括號中的陣列長度,例如int a[ 1]。然而,這種行為讓開發人員感到困惑,因為長度似乎沒有實際效果。
考慮以下範例:
#include <iostream> int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
在此程式碼中,函數 dis 宣告了一個陣列參數長度為 1 (a[1]),但仍可存取 a[2]。這就提出了一個問題:如果不強制執行,為什麼編譯器允許在函式簽章中使用陣列長度?
答案在於 C/ 中數組傳遞的獨特行為C.與許多其他語言不同,C 和 C 不允許將數組直接傳遞給函數。相反,傳遞的是指向數組第一個元素的指標。
因此,函數簽章中指定的陣列長度變得無關緊要。指標中不包含長度訊息,因此編譯器會忽略括號中的長度。
此行為源自於 20 世紀 70 年代 C 開發早期階段所做的決定。儘管多年來它引起了混亂,但該語法在 C 和 C 中仍然很流行。
數組傳遞的這種怪癖有幾個含義:
以上是為什麼編譯器會忽略 C/C 函式簽章中的陣列長度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!