程式的記憶體分配

2022-07-22 17:36:21 字數 1597 閱讀 2369

棧區(stack)

由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其他操作類似於資料結構中的棧。

堆區(heap)

一般有程式設計師分配釋放,若程式設計師不釋放,程式結束後可能有os**。它和資料結構中的堆不是一回事,分配方式類似於鍊錶。

全域性區(靜態區static)

全域性變數和靜態變數儲存在之一區域,初始化的全域性變數和靜態變數在這一區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一區域。程式結束後由系統釋放。

文字常量區

常量字串存放在這一區域。程式結束後由系統釋放。

程式**區

存放函式體的二進位制**。

程序記憶體分配圖

高位址

低位址

段區名

解釋

內容

stack

棧:區域性變數

1、在函式內部定義的區域性變數(非static型)

2、中斷發生時存放的執行環境

room

增長空間:堆向上長,棧向下長

堆和棧動態變化的空間,

1、堆從低位址向上動態增長

2、棧從高位址向下動態增長

heap

堆:動態分配的記憶體空間

1、程式執行時動態分配的空間,如malloc函式,new等

2、動態釋放,如free函式,delete等

other

其他.bss

未初始化的全域性變數區

函式外部定義的(全域性變數),如

1、   int i;

2、   static int j;

.data

已初始化的全域性變數區

1、函式外定義的:static int i = 0;

2、函式內部定義的:static int j;//編譯器自動初始化為0

.text

可執行檔案

1、程式**,即當前cpu的二進位制機器碼

2、常量,如const char msg=」hello world\n」

注:1、微控制器,可執行檔案一般沒必要載入到記憶體中,也就不存在.text段。

2、對於多工系統來說,乙個程序的記憶體分配往往是動態的,因此堆區實際位址空間可能不連續。

3、棧區作為存放區域性變數的區域,往往可以設定其最大大小,執行時超出定義大小則會產生越界錯誤(段錯誤的一種)。

unix系統程序記憶體占用示意圖

參考:

程式的記憶體分配

一 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是...

程式的記憶體分配

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結...

程式的記憶體分配

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結...