程序的內存分配

棧區(stack)程序員

  由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其餘操做相似於數據結構中的棧。數據結構

堆區(heap)函數

  通常有程序員分配釋放,若程序員不釋放,程序結束後可能有OS回收。它和數據結構中的堆不是一回事,分配方式相似於鏈表。spa

全局區(靜態區static).net

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

文字常量區blog

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

程序代碼區內存

  存放函數體的二進制代碼。ci

進程內存分配圖

高地址

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

低地址

段區名

解釋

內容

stack

棧:局部變量

一、在函數內部定義的局部變量(非static型)

二、中斷髮生時存放的運行環境

room

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

堆和棧動態變化的空間,

一、堆從低地址向上動態增加

二、棧從高地址向下動態增加

heap

堆:動態分配的內存空間

一、程序運行時動態分配的空間,如malloc函數,new等

二、動態釋放,如free函數,delete等

other

其餘

 

.bss

未初始化的全局變量區

函數外部定義的(全局變量),如

一、   int I;

二、   static int j;

.data

已初始化的全局變量區

一、函數外定義的:static int i = 0;

二、函數內部定義的:static int j;//編譯器自動初始化爲0

.text

可執行文件

一、程序代碼,即當前CPU的二進制機器碼

二、常量,如const char msg[]=」hello world\n」

注:

  一、單片機,可執行文件通常不必加載到內存中,也就不存在.text段。

  二、對於多任務系統來講,一個進程的內存分配每每是動態的,所以堆區實際地址空間可能不連續。

  三、棧區做爲存放局部變量的區域,每每能夠設置其最大大小,運行時超出定義大小則會產生越界錯誤(段錯誤的一種)。

 

         unix系統進程內存佔用示意圖

參考:

  https://blog.csdn.net/hitman_cs/article/details/70599071

  https://blog.csdn.net/qq792326645/article/details/49783347

相關文章
相關標籤/搜索