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

C 語言大數組定義位置導致棧溢出?main 內 vs 全局區別詳解

     編輯:程式設計綜合問答

int G[1000][1000] 佔用 1000*1000*4 = 400MB 內存。定義位置不同,後果天壤之別:

定義在 main 內(棧區)

  • 棧默認 1~8MB,400MB 直接爆棧 → 程序啟動即崩潰,連 scanf 都執行不到。
  • 現象:控制台一閃而過,無任何輸出。

定義在全局/靜態區(.bss 段)

  • 全局/靜態變量存放在數據段,大小受虛擬內存限制(通常數 GB),400MB 輕鬆容納。
  • 程序正常運行,scanf 可正常讀取輸入。

驗證代碼

// 正確:全局定義
int G[1000][1000];
int main() { scanf("%d", &n); ... }

替代方案

  1. 動態分配:int **G = malloc(1000 * sizeof(int*)); for(i) G[i]=malloc(1000*sizeof(int)); 釋放時逐行 free。
  2. 靜態局部變量:static int G[1000][1000]; 同全局,不佔棧。
  3. 縮小數組:若算法允許,用 short 或位圖壓縮。

面試必考點

「區分棧、堆、數據段、代碼段內存分布,說明大對象定義位置的影響。」

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