現象
int allPixel[480*640]; // 307,200 個 int = 1.2 MB → Stack Overflow
char allPixel[480*640]; // 307,200 個 char = 300 KB → 可能成功
根本原因:堆疊大小限制
| 平台/編譯器 | 預設堆疊大小 | 備註 |
| Linux (pthread) | 8 MB | ulimit -s 可調整 |
| Windows (MSVC) | 1 MB | 連結選項 /STACK:reserve[,commit] |
| 嵌入式系統 | 極小 (KB 級) | 極嚴格限制 |
解決方案
方案一:動態配置到堆積
// C 風格
int *allPixel = malloc(480 * 640 * sizeof(int));
if (!allPixel) { /* 處理失敗 */ }
// 使用完畢
free(allPixel);
// C++ 風格 (推薦)
std::vector allPixel(480 * 640); // 自動管理記憶體
方案二:靜態/全域儲存區
static int allPixel[480*640]; // 函數內 static
// 或檔案域
int allPixel[480*640]; // 全域變數
// 存放於 .bss/.data 區,非堆疊
方案三:增加堆疊大小 (Visual Studio)
// 專案屬性 → Linker → System → Stack Reserve Size
// 設為 4194304 (4 MB) 或更大
大小計算對照
| 類型 | 元素數 | 位元組大小 | 堆疊壓力 |
int[480*640] | 307,200 | 1,228,800 B (1.2 MB) | 超過 1 MB 預設值 |
char[480*640] | 307,200 | 307,200 B (300 KB) | 通常安全 |
double[10000] | 10,000 | 80,000 B (78 KB) | 安全 |
最佳實務
- 大型陣列 務必用動態配置 (
malloc/new/vector)
- 遞迴函數避免大型區域陣列
- 嵌入式開發:禁用區域大型陣列,統一靜態配置
- C++ 推薦
std::vector、std::unique_ptr 替代裸指標
- 上一篇文章: C 語言求 100~200 質數:賦值與比較運算子混淆導致全輸出
- 下一篇文章: C 語言檔案讀取與字元編碼:fgetc 回傳 int 與 ASCII 值解析
Copyright ©
程式碼之家 All Rights Reserved