函數簽章中的陣列長度:令人困惑的異常
在 C 和 C語言中,函數簽章通常包含用方括號括起來的陣列長度,例如如範例所示:
int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; }
但是,此語法似乎有沒有實際效果,如上述程式碼成功存取超出陣列宣告長度的元素的事實所示。這就提出了一個問題:為什麼編譯器允許這種看似多餘的符號?
答案在於 C 和 C 中陣列處理的實作細節。 C 和 C 中的陣列本質上是指向陣列第一個元素的位址。當一個陣列被傳遞給一個函數時,它的位址被複製,有效地傳遞了一個指標。
在上面的範例中,函數 dis 接受一個宣告長度為 1 的字元陣列 a。數組作為指標傳遞,長度規範無關緊要,即使索引超過聲明的長度,函數也可以存取數組的任何元素。
參數語法中的這種不一致一直是一個問題自從這些語言早期引入以來,爭論了幾十年。雖然有些人主張更一致的語法,但有些人則將與遺留程式碼的兼容性作為維持當前行為的原因。
儘管它可能會導致混亂,但對函數簽章中具有未指定長度的陣列的容忍是一個副產品C 和 C 中基於指標的陣列實作。它提醒人們不同語言特徵之間的相互作用可能產生的細微差別。
以上是為什麼 C 和 C 函數簽章允許無效的陣列長度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!