float x[60000][15]; // 約 60000 * 15 * 4 bytes = 3.6 MB
錯誤訊息:LINK : warning LNK4098、unresolved external symbol __security_cookie、fatal error LNK1120。
真相:連結器錯誤是誤導,真正原因是堆疊溢位。
3.6 MB > 1 MB → 函式序言配置堆疊框架失敗 → 執行期崩潰(有時表現為連結器符號解析失敗)。float **x = malloc(60000 * sizeof(float*));
for (int i = 0; i < 60000; i++)
x[i] = malloc(15 * sizeof(float));
// 使用完畢
for (int i = 0; i < 60000; i++) free(x[i]);
free(x);
或用連續記憶體:float *x = malloc(60000 * 15 * sizeof(float)); 存取 x[i*15 + j]。
static float x[60000][15]; // 檔案作用域或函式內 static
int main() { ... }
優點:簡單、無須手動釋放。缺點:執行檔體積增大、多執行緒不安全、嵌入式系統可能超過資料段限制。
4000000 (4 MB)。gcc -Wl,--stack,4194304 main.c (MinGW) 或 pthread_attr_setstacksize (Linux 執行緒)。| 特性 | 堆疊 | 堆積 |
|---|---|---|
| 管理方式 | 編譯器自動(LIFO) | 程式設計師手動 |
| 大小限制 | 小 (1~8 MB) | 大 (虛擬記憶體上限) |
| 配置速度 | 極快 (指標遞增) | 較慢 (尋找空閒塊) |
| 適用場景 | 小型、生命週期固定 | 大型、動態、跨函式共享 |
malloc/new 或 static。valgrind --tool=massif 或 VS 診斷工具監控堆疊用量。