首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言二維陣列越界卻能賦值輸出?屬於未定義行為

     編輯:程式設計綜合問答

程式碼宣告 int iArray[3][4];,合法索引範圍為 [0..2][0..3]。但程式直接對 iArray[3][4] = 1000; 賦值並輸出,結果竟正常印出 1000,令人困惑。

原因解析

C 標準規定:存取陣列越界屬於未定義行為。此處之所以「看似正常」,是因為:

  • 編譯器未做邊界檢查,直接計算位移 base + (3*4 + 4)*sizeof(int) 寫入記憶體。
  • 該位址剛好落在程式自身的棧空間或未被其他資料佔用,寫入後讀回無衝突。
  • 若該記憶體屬於其他變數、回傳位址或系統保護區,輕則資料錯亂,重則段錯誤。

警示

「能跑」不代表「正確」。永遠不要依賴越界存取,開啟編譯器警告(-Wall -Wextra)並使用 AddressSanitizer(-fsanitize=address)偵測此類錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved