首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

new[] 越界訪問血淚教訓:斐波那契數列動態數組邊界條件缺失

     編輯:關於C語言

問題代碼


long long FibonacciSeq(int n) {
    long long *fib = new long long[n+1]; // n=0 時僅分配 1 個元素
    fib[0] = 0;
    fib[1] = 1; // n=0 時越界寫入!
    for (int i = 2; i <= n; i++) fib[i] = fib[i-1] + fib[i-2];
    long long ret = fib[n];
    delete[] fib;
    return ret;
}

崩潰現場分析

Debug 模式下,MSVC 在堆塊頭尾放置0xFD保護位模式。
n=0時:
1. new long long[1]分配 8 字節,前後各 4 字節0xFD保護區。
2. fib[0]=0正常。
3. fib[1]=1寫入第 2 個long long(偏移 8 字節),**正好覆蓋右側保護區**。
4. delete[]檢測到右側保護區損壞,觸發斷點中斷。

內存佈局圖解

[左保護區 4B][fib[0] 8B][右保護區 4B][堆管理元數據...]
           ↑fib指針
fib[1] 寫入位置 → 覆蓋右保護區

修正方案


long long FibonacciSeq(int n) {
    if (n == 0) return 0; // 邊界條件檢查!
    long long *fib = new long long[n+1];
    fib[0] = 0; fib[1] = 1;
    for (int i = 2; i <= n; i++) fib[i] = fib[i-1] + fib[i-2];
    long long ret = fib[n];
    delete[] fib;
    return ret;
}

通用防範原則

  • **動態數組分配前必檢查尺寸合法性**(n >= 0、size > 0)。
  • 優先使用std::vector自動管理內存、邊界檢查(at())。
  • 若必須用裸指針,封裝 RAII 類管理生命周期。
  • 開啟編譯器檢查(/RTCs、-fsanitize=address)捕獲越界。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved