初學者常犯錯:宣告陣列時未指定足夠大小,導致寫入時超出記憶體邊界。本文以實際代碼為例,解析錯誤原因與修正方法。
#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)。sinTable[1],屬於緩衝區溢位(Buffer Overflow),行為未定義,可能導致程式崩潰或無症狀資料損壞。double sinTable[512] = {0}; // 或 [513] 視需求
#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)可在編譯/執行期捕捉此類錯誤。std::array 固定大小陣列,兼具效能與安全。「陣列大小未明確指定」是 C/C++ 新手最常見的坑。養成「先定大小、再寫入」或改用 std::vector/std::array 的習慣,能從根本避免緩衝區溢位風險。