在 C 語言中,記憶體分配主要分為以下幾個區域:
一、棧(Stack)
-
儲存內容:
- 區域性變數:在函式內部宣告的變數,包括自動變數和函式引數。
- 函式呼叫資訊:當函式被呼叫時,會在棧上分配空間來儲存函式的返回地址、引數和區域性變數。
-
特點:
- 記憶體由編譯器自動管理,分配和釋放非常高效。
- 空間相對較小,一般幾兆位元組到幾十兆位元組。
- 先進後出(FILO)的資料結構,函式呼叫結束後,區域性變數的記憶體會自動釋放。
二、堆(Heap)
-
儲存內容:
- 透過動態記憶體分配函式(如 malloc、calloc、realloc 等)分配的記憶體塊。
- 可以儲存任意大小的資料結構,如大型陣列、結構體等。
-
特點:
- 記憶體由程式設計師手動管理,需要顯式地呼叫 free 函式釋放記憶體,否則會導致記憶體洩漏。
- 空間相對較大,可以根據程式的需要動態分配和釋放。
- 分配的記憶體地址是隨機的,不像棧那樣有固定的增長方向。
三、全域性/靜態儲存區
-
儲存內容:
- 全域性變數:在函式外部宣告的變數,在整個程式的生命週期內都存在。
- 靜態變數:使用 static 關鍵字宣告的變數,包括靜態區域性變數和靜態全域性變數。
-
特點:
- 在程式編譯時分配記憶體,在程式結束時釋放。
- 全域性變數和靜態變數的初始化只在程式啟動時進行一次。
四、常量儲存區
-
儲存內容:
- 常量字串、常量數值等不可修改的資料。
-
特點:
- 記憶體中的資料在程式執行期間不能被修改。
- 通常由編譯器分配和管理。
五、程式碼區
-
儲存內容:
- 程式的機器程式碼。
-
特點:
- 只讀區域,儲存著程式的指令。
- 由作業系統載入到記憶體中,在程式執行期間不會被修改。