棧區(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 注意它與資料結...