C中的記憶體分配模型

西北野狼發表於2024-08-22

在 C 語言中,記憶體分配主要分為以下幾個區域:

一、棧(Stack)

  1. 儲存內容

    • 區域性變數:在函式內部宣告的變數,包括自動變數和函式引數。
    • 函式呼叫資訊:當函式被呼叫時,會在棧上分配空間來儲存函式的返回地址、引數和區域性變數。
  2. 特點

    • 記憶體由編譯器自動管理,分配和釋放非常高效。
    • 空間相對較小,一般幾兆位元組到幾十兆位元組。
    • 先進後出(FILO)的資料結構,函式呼叫結束後,區域性變數的記憶體會自動釋放。

二、堆(Heap)

  1. 儲存內容

    • 透過動態記憶體分配函式(如 malloc、calloc、realloc 等)分配的記憶體塊。
    • 可以儲存任意大小的資料結構,如大型陣列、結構體等。
  2. 特點

    • 記憶體由程式設計師手動管理,需要顯式地呼叫 free 函式釋放記憶體,否則會導致記憶體洩漏。
    • 空間相對較大,可以根據程式的需要動態分配和釋放。
    • 分配的記憶體地址是隨機的,不像棧那樣有固定的增長方向。

三、全域性/靜態儲存區

  1. 儲存內容

    • 全域性變數:在函式外部宣告的變數,在整個程式的生命週期內都存在。
    • 靜態變數:使用 static 關鍵字宣告的變數,包括靜態區域性變數和靜態全域性變數。
  2. 特點

    • 在程式編譯時分配記憶體,在程式結束時釋放。
    • 全域性變數和靜態變數的初始化只在程式啟動時進行一次。

四、常量儲存區

  1. 儲存內容

    • 常量字串、常量數值等不可修改的資料。
  2. 特點

    • 記憶體中的資料在程式執行期間不能被修改。
    • 通常由編譯器分配和管理。

五、程式碼區

  1. 儲存內容

    • 程式的機器程式碼。
  2. 特點

    • 只讀區域,儲存著程式的指令。
    • 由作業系統載入到記憶體中,在程式執行期間不會被修改。

相關文章