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

C 語言二維陣列過大導致 Stack Overflow:改用動態記憶體配置 malloc

     編輯:程式設計綜合問答

區域宣告 int a[1000][1000] 需約 4MB 棧空間,超過預設堆疊大小(Windows 1MB、Linux 8MB),導致執行時期崩潰。

錯誤示範

int a[1000][1000]; // Stack overflow

正確做法:Heap 動態配置

int rows = 1000, cols = 1000;
int **a = (int**)malloc(rows * sizeof(int*));
for (int i = 0; i < rows; i++) {
    a[i] = (int*)malloc(cols * sizeof(int));
}
// 使用 a[i][j] ...
// 釋放
for (int i = 0; i < rows; i++) free(a[i]);
free(a);

替代:連續記憶體區塊(效能更好)

int *flat = (int*)malloc(rows * cols * sizeof(int));
#define IDX(i,j) flat[(i)*cols + (j)]
IDX(0,0) = 1;
// 釋放 free(flat);

補充

  • 靜態/全域陣列放在 .bss/.data 區,不受堆疊限制,但會增加執行檔體積。
  • C99 支援變長陣列 (VLA) int a[n][m],但仍分配於堆疊,大陣列同樣危險。
  • 嵌入式系統堆疊極小,務必用靜態或動態配置。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved