函數簽章中的陣列:C 和C 語言中的奇怪異常
在C 和C 語言中,陣列長度通常在函數簽名中指定,使用語法int a[size]。然而,當不強制執行這些長度時,就會出現奇怪的行為。
dis(char a[1]) 的神秘案例
考慮以下程式碼片段:
#include <iostream> using namespace std; int dis(char a[1]) { int length = strlen(a); char c = a[2]; // Attempt to access element beyond specified length return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
在這個例子中,函數dis聲明了一個大小為1 的陣列參數a。但是,程式存取的是元素超出此大小不會出現任何編譯器錯誤。這就提出了一個問題:如果不強制執行,為什麼編譯器允許在函式簽章中使用陣列長度?
一個奇怪的語言特性
答案在於 C 和C 在函數呼叫中處理陣列。實際上,數組不能直接傳遞給函數。相反,傳遞的是指向數組第一個元素的指針,不攜帶有關數組長度的信息。
因此,編譯器會忽略函式簽章中指定的大小(在本例中為 [1]) 。這個決定可以追溯到 20 世紀 70 年代,並給開發人員帶來了極大的困惑。
對程式設計的影響
這個怪癖有幾個意義:
以上是為什麼 C 和 C 編譯器忽略函式簽章中的陣列長度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!