將應用程序加載到內存空間執行時,操作系統負責代碼段、數據段和BSS段的加載,并在內存中為這些段分配空間。
棧段亦由操作系統分配和管理,而不需要程序員顯示地管理;堆段由程序員自己管理,即顯示地申請和釋放空間。
進程使用的內存按功能劃分,從高地址到低地址:
棧區
:stack
存放函數的參數值、局部變量的值,以及在進行任務切換時存放當前任務的上下文內容。
棧區上的內容只在函數范圍內存在,當函數運行結束,這些內容也會自動被銷毀。
其特點是效率高,但內存大小有限。
堆區
:heap 動態內存分配
malloc分配的內存區域,其生命周期由free決定。
全局區,即靜態存儲區,存儲全局變量和靜態變量。
(初始化分配于數據段,未初始化分配于BSS區)
數據段
:data segment
存放已初始化的全局變量、靜態變量(已初始化全局靜態變量,局部靜態變量)、常量數據。
BSS段
:Block Started by Symbol 未初始化數據段。未初始化全局變量、未初始化靜態變量。
數據段屬于靜態內存分配,可以分為只讀數據段和讀寫數據段。字符串常量等一般都是放在只讀數據段中。
代碼區
:code/text segment 存放CPU執行的機器指令,字符串常量。
儲程序代碼指令,define定義的常量。
動態分配內存可能發生的問題:
主要有三種類型:內存泄露、內存碎片和內存崩潰
內存崩潰是內存使用最嚴重的結果,主要原因有數組訪問越界、寫已經釋放的內存、指針計算錯誤、訪問堆棧地址越界等等。碎片收集的問題,變量的持行時間等。