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

C 語言陣列溢出警告與執行時檢查失敗:緩衝區寫入越界與棧損毀分析

     編輯:程式設計綜合問答

錯誤程式碼

#define N 5
int a[N];
for (int i = 0; i < N; i++) a[N] = i; // 寫入 a[5] 越界
for (int i = 0; i < N; i++) printf("%5d", a[N]); // 讀取 a[5] 越界

編譯器警告 C4789

緩衝區 'a' (大小 20 位元組) 將溢出;4 位元組將在偏移 20 開始寫入

  • a 為 int[5],佔 20 位元組(索引 0~4)。
  • a[5] 位於偏移 20,屬於緩衝區外。

執行時檢查失敗

Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.

  • MSVC Debug 模式在函數結尾檢查棧緩衝區金絲雀值。
  • 越界寫入覆蓋了鄰近變數或堆疊保護區,觸發檢測。

為何仍有輸出「4 4 4 4 4」?

  • 未定義行為:編譯器可能將 a[N] 優化為常數存取,或恰好覆蓋了迴圈變數 i 導致迴圈提前結束並印出殘留值。
  • **不可依賴**任何輸出結果,程式已進入未定義行為領域。

正確寫法

for (int i = 0; i < N; i++) a[i] = i;
for (int i = 0; i < N; i++) printf("%5d", a[i]);

總結

陣列索引合法範圍 0 ~ N-1。a[N] 為越界存取,導致緩衝區溢出警告、執行時棧損毀檢測失敗,輸出結果不可信。務必嚴格檢查迴圈邊界。

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