C語言為什麼不做陣列下標越界檢查?
阿新 • • 發佈:2021-11-21
這是C語言的歷史問題,從一開始就沒有,後來這個功能也沒有加上。綜合網上的各種資料,可以得到如下的結果:
1. 在一個固定的機器之下,指標所佔的位數都是一樣的,換言之,儲存的地址是有最大值的,這樣如果每次都檢查陣列的越界問題,會對指標的功能做出很大的限制,因為指標只是包含地址資訊並沒有包含長度的資訊,比如一個
char ch[100];
char * test=ch;
之後test也可以只想超過100的長度的字串型別,並不是侷限與100。如果檢測長度,那麼就相當與限制的指標的長度,這是不合理的。
2. 沒有效率,需要付出代價。具體:最早的C編譯器並不檢查下標,而最新的編譯器依然不對它進行檢查。這項任務之所以很困難,是因為下標引用可以作為任意的指標,而不僅僅是陣列名。作用於指標的下標引用的有效性既依賴於該指標當時恰好指向什麼內容,也依賴於下標的值。結果,C的下標檢查所涉及的開銷比你開始想象的要多。編譯器必須在程式中插入指令,證實下標的結果所引用的元素和指標表示式所指向的元素屬於同一個陣列。這個比較操作需要程式中所有陣列的位置和長度方面的資訊,這將佔用一些空間。當程式執行時,這些資訊必須進行更新,以反映自動和動態分配的陣列,這又將佔用一定的時間。因此,即使是那些提供了下標檢查的編譯器通常也會提供一些開關,允許你去掉下標檢查。
3.為了提高執行效率,不檢查陣列下表越界,程式就可以跑得快。因為C語言並不是一個快速開發語言,它要求開發人員保證所有邏輯的正確性。所以至少到目前為止,C語言是所有高階語言中速度最快,效率最高的。幾乎所有對效能有苛刻要求的場合都使用C語言。
但是,如果越界引用,也可能會發生意想不到的情況 ,比如訪問沒有許可權訪問的記憶體,導致程式出錯崩潰。