為什麼越界指針算術未定義行為?
越界指標算術,如程式碼片段所示下面,被認為是 C 中的未定義行為。
int arr[4] = {0, 1, 2, 3}; int* p = arr + 5; // Undefined behavior
與指針應表現得像整數的預期相反,它們具有獨特的特徵。問題的癥結在於 C 標準本身,明確地將越界指標運算歸類為未定義行為。
雖然在大多數平台上,超出數組邊界的指針算術不會導致只要指針保持未解除引用狀態,就會發生崩潰或異常行為,如果不打算使用這種算術,那麼人們必須質疑這種算術的目的。
但是,C 11 規範明確承認表達式超出數組末尾的精確度一個在技術上是「正確的」並且不會導致崩潰。然而,它的結果是未定義的,而表達式超過數組邊界是嚴格未定義的行為。
需要強調的是,儘管允許存取超出數組末尾的一個位置,但這並不意味著安全。在此擴展範圍內讀取或寫入數據可能會操作數組邊界之外的數據,從而導致記憶體損壞和狀態不一致。
這種對越界指針算術的嚴格立場背後的基本原理是潛在的複雜性指針運算可能導致危險情況的場景。因此,為了避免不一致並保持一致性,完全禁止此類行為被認為更簡單。
以上是為什麼 C 中的越界指標運算被視為未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!