![](http://static.javashuo.com/static/loading.gif)
上圖是進程的虛擬地址空間示意圖。程序員
堆棧段:數組
1. 爲函數內部的局部變量提供存儲空間。數據結構
2. 進行函數調用時,存儲「過程活動記錄」。架構
3. 用做暫時存儲區。如計算一個很長的算術表達式時,能夠將部分計算結果壓入堆棧。函數
數據段(靜態存儲區):.net
包括BSS段的數據段,BSS段存儲未初始化的全局變量、靜態變量。數據段存儲通過初始化的全局和靜態變量。3d
代碼段:unix
又稱爲文本段。存儲可執行文件的指令。指針
堆:code
就像堆棧段可以根據須要自動增加同樣,數據段也有一個對象,用於完成這項工做,這就是堆(heap)。堆區域用來動態分配的存儲,也就是用 malloc 函數活的的內存。calloc和realloc和malloc相似。前者返回指針的以前把分配好的內存內容都清空爲零。後者改變一個指針所指向的內存塊的大小,能夠擴大和縮小,他常常把內存拷貝到別的地方而後將新地址返回。
一、棧區(stack):由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。
二、堆區(heap):由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式卻是相似於鏈表。
三、全局區(靜態區):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。 程序結束後由系統釋放。
四、文字常量區:常量字符串就是放在這裏的。 程序結束後由系統釋放。
五、程序代碼區:存放函數體的二進制代碼。
BSS段:BSS段(bss segment)一般是指用來存放程序中未初始化的全局變量和靜態變量的一塊內存區域。BSS是英文Block Started by Symbol的簡稱。BSS段屬於靜態內存分配。
數據段:數據段(data segment)一般是指用來存放程序中已初始化的全局變量和靜態變量的一塊內存區域。數據段屬於靜態內存分配。
代碼段:代碼段(code segment/text segment)一般是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經肯定,而且內存區域一般屬於只讀, 某些架構也容許代碼段爲可寫,即容許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。
堆(heap):堆是用於存放進程運行中被動態分配的內存段,它的大小並不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)
棧(stack):棧又稱堆棧, 是用戶存放程序臨時建立的局部變量,也就是說咱們函數括弧「{}」中定義的變量(但不包括static聲明的變量,static意味着在數據段中存放變量)。除此之外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,而且待到調用結束後,函數的返回值也會被存放回棧中。因爲棧的先進先出特色,因此棧特別方便用來保存/恢復調用現場。從這個意義上講,咱們能夠把堆棧當作一個寄存、交換臨時數據的內存區。堆棧又稱堆棧(stack)在計算機科學中,是一種特殊的鏈表形式的數據結構,它的特殊之處在於只能容許在鏈表的一端(稱爲棧頂,英文爲top)進行添加和刪除操做。另外堆棧數據結構的實現也能夠經過數組來完成。
嚴格來講堆是指Heap,程序運行時供程序員來支配的一段內存。而棧Stack,多指函數調用時候參數的相互傳遞存在的內存區域。因爲堆棧數據結構只容許在一端進行操做,於是按照先進後出(LIFO-Last In First Out)的原理工做。堆棧數據結構支持兩種基本操做:壓棧(push)和彈棧(pop):
1. 壓棧(入棧):將對象或者數據壓入棧中,更新棧頂指針,使其指向最後入棧的對象或數據。 2. 彈棧(出棧):返回棧頂指向的對象或數據,並從棧中刪除該對象或數據,更新棧頂。