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