棧區(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系統進程內存占用示意圖
參考:
https://blog.csdn.net/hitman_cs/article/details/70599071
https://blog.csdn.net/qq792326645/article/details/49783347