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

C 語言大陣列宣告:全域變數 vs 區域變數的記憶體配置差異

     編輯:程式設計綜合問答

C 語言中宣告大型陣列(如 int c[1001][1001])若放在函式內(區域變數),會導致堆疊溢位;移至函式外(全域/靜態變數)則配置於資料段(BSS/Data),空間充足無溢位風險。

記憶體區域對照

宣告位置儲存區域大小限制生命週期初始值
函式內(區域)堆疊通常 1~8 MB(編譯器/OS 可調)函式執行期間未初始化則不定值
函式外(全域)全域/靜態區 (.bss/.data)受限於虛擬記憶體,通常 GB 級程式全生命週期自動歸零
函式內 static全域/靜態區同全域程式全生命週期自動歸零
malloc/new堆積受限於虛擬記憶體手動釋放前未初始化

程式碼對比

// 錯誤:區域大陣列 -> Stack Overflow
void foo() {
    int big[10000][10000]; // ~400 MB,遠超堆疊
}

// 正確 1:全域陣列
int big[10000][10000]; // 配置於 .bss,編譯期確定大小
void foo() { ... }

// 正確 2:動態配置(執行期決定大小)
void foo() {
    int **big = malloc(10000 * sizeof(int*));
    for (int i=0; i<10000; i++) big[i] = malloc(10000 * sizeof(int));
    // 用完後必須 free
}

最佳實務建議

  • 編譯期已知大小且極大 → 全域/靜態陣列(簡單、無需釋放)。
  • 執行期才知大小 → malloc/new 動態配置,記得檢查回傳值與釋放。
  • 遞迴/多執行緒 → 避免大型區域陣列,改用動態配置或靜態區。
  • 嵌入式系統:RAM 極小,全域大陣列可能超出 .bss 限制,需用動態配置並嚴格控制。

補充:C99 變長陣列 (VLA)

void foo(int n) {
    int arr[n][n]; // 配置於堆疊,n 過大同樣會溢位,C11 為可選特性,不建議依賴
}

理解「區域=堆疊、全域/靜態=資料段、動態=堆積」的配置規則,是寫出穩健 C 程式的關鍵。

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