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

C++ 陣列越界錯誤:靜態陣列大小不足導致緩衝區溢位

     編輯:程式設計綜合問答

初學者常犯錯:宣告陣列時未指定足夠大小,導致寫入時超出記憶體邊界。本文以實際代碼為例,解析錯誤原因與修正方法。

錯誤代碼

#define M_PI 3.14159265358979323846

int main() {
    int tableSize = 512;
    double sinTable[] = {0};  // 錯誤:僅配置 1 個元素
    for (int n = 0; n < (tableSize + 1); n++) {
        sinTable[n] = sin(2 * M_PI * n / tableSize); // 越界寫入
        printf("s=%lf\n", sinTable[0]);
    }
    return 0;
}

錯誤分析

  • double sinTable[] = {0}; 只初始化 1 個 double 元素(大小 8 bytes)。
  • 迴圈執行 513 次(0~512),第 2 次迴圈即寫入 sinTable[1],屬於緩衝區溢位(Buffer Overflow),行為未定義,可能導致程式崩潰或無症狀資料損壞。

修正方法

方法一:靜態陣列指定大小

double sinTable[512] = {0}; // 或 [513] 視需求

方法二:動態配置(推薦現代 C++)

#include <vector>
#include <cmath>

int main() {
    const int tableSize = 512;
    std::vector<double> sinTable(tableSize + 1);
    for (int n = 0; n <= tableSize; ++n) {
        sinTable[n] = std::sin(2 * M_PI * n / tableSize);
    }
    // 使用 sinTable.data() 取得指標
    return 0;
}

優點:自動管理記憶體、避免越界、可攜性佳。

補充提醒

  • 迴圈條件 n < (tableSize + 1) 會產生 513 個元素(0~512),陣列大小至少需 513。
  • 啟用編譯器警告(-Wall -Wextra -fsanitize=address)可在編譯/執行期捕捉此類錯誤。
  • C++17 起可用 std::array 固定大小陣列,兼具效能與安全。

結語

「陣列大小未明確指定」是 C/C++ 新手最常見的坑。養成「先定大小、再寫入」或改用 std::vector/std::array 的習慣,能從根本避免緩衝區溢位風險。

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