C 編譯中的未定義行為
在給定的程式碼中,預期的行為是從索引0 到3 迭代數組mc並輸出值,產生數字序列「0、1、2、3」。然而,觀察到的行為是一個無限循環,輸出一連串無止盡的「0, 1, 2, 3, ....」。
問題的根源在於賦值語句 delta = mc[迪]。此操作嘗試存取超出其有效索引的陣列 mc,特別是在索引 4(越界)處。在 C 中,此類存取會呼叫未定義的行為,從而允許編譯器以不可預測的方式運作。
在這種情況下,啟用最佳化的編譯器(例如,使用 -O2 標誌)假定沒有未定義的行為發生。具體而言,推論di<1。 4 始終為真,因為越界訪問 mc[di] 將是未定義的。
此假設會導致激進的循環最佳化。在最佳化後的程式碼中,di
使用 -fno-aggressive-loop-optimizations 標誌關閉激進循環最佳化會導致編譯器如預期運作。它可以識別潛在的未定義行為並防止有問題的最佳化。
需要注意的是,C 中的未定義行為可能會產生不可預測且潛在有害的後果。建議避免依賴未定義的行為並編寫符合語言規範的程式碼。
以上是為什麼我的 C 循環在訪問越界數組時會永遠運行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!