一般全域變數存放在資料區,局部變數存放在棧區,
動態變數存放在堆區,函數代碼放在代碼區。
---------------------------------------------------------------
棧區是普通的棧資料結構,遵循LIFO後進先出的規則,局部變數安排在那裡是ASM時就規定的,這樣可以在一個函數結束後平衡堆棧,操作簡單,效率高
堆(動態區)在這裡應當叫堆棧(不要和資料結構中的堆搞混)是程式在編譯時間產生的一塊用於產生動態記憶體分配使用的塊,操作比較棧要麻煩許多,在分配時要判斷最優的地址(防止產生無用的記憶體片段(由於屢次的NEW和DELETE產生的夾在兩塊使用中記憶體中的空餘小記憶體(不容易被分配))),分配和回收時的效率比棧低多了
---------------------------------------------------------------
棧是系統提供的功能,特點是快速高效,缺點是有限制,資料不靈活;而堆是函數庫提供的功能,特點是靈活方便,資料適應面廣泛,但是效率 >有一定降低。棧是系統資料結構,對於進程/線程是唯一的;堆是函數庫內部資料結構,不一定唯一。不同堆分配的記憶體無法互相操作。棧空間分靜態分配和動態分配兩種。靜態分配是編譯器完成的,比如自動變數(auto)的分配。動態分配由alloca函數完成。棧的動態分配無需釋放(是自動的),也就沒有釋放函數。為可移植>的程式起見,棧的動態分配操作是不被鼓勵的!堆空間的分配總是動態,雖然程式結束時所有的資料空間都會被釋放回系統,但是精確的申請記憶體/ 釋放記憶體匹>配是良好程式的基本要素。
現在舉個例子來說明這些“段”的區別
#include <malloc.h>
unsigned char gvch;
unsigned char short gvshort;
unsigned int gvint=0x12345645;
unsigned long gvlong=0x87654321;
void main()
{
unsigned char array[10],*p;
p=malloc(10*sizeof(char));
while(1);
}
-----------------------------------------------------------------
以上程式中代碼是存放在代碼區中,比如while(1);
gvch與gvshort兩個全域變數由於沒有付初值所以存放在:bss段中
gvint與gvlong兩個全域變數付初值了所以存放在:資料區段中
array數組與p變數為局部變數所以存放在:棧區
malloc函數申請的空間是屬於動態,所以儲存在:堆區
-------------------------------------------------------------------------------------------------------
補充:
BSS(Block Started by Symbol)通常是指用來存放程式中未初始化的全域變數和靜態變數的一塊記憶體地區。
注意和資料區段的區別,BSS存放的是未初始化的全域變數和靜態變數,資料區段存放的是初始化後的全域變數和靜態變數。