1. 程式人生 > 其它 >記憶體空間分佈

記憶體空間分佈

.code或.text,程式碼段:用來存放可執行的機器指令的一塊記憶體區域,這部分割槽域的程式碼屬於只讀。字串常量也在也在程式碼段上。

.data,資料段:用來存放程式中已初始化的全域性變數的一塊記憶體區域,例如已初始化的全域性變數和區域性靜態變數(初始化為非0)。

.bss:用來存放程式中未初始化的全域性變數的一塊記憶體區域,例如未初始化的全域性變數和區域性靜態變數(未初始化或初始化為0)。

堆(heap):用來存放程序執行中被動態分配的記憶體段,大小並不固定,可動態擴張或縮減,典型操作malloc和free。堆的申請過程比較複雜,當系統收到程式的申請時,會遍歷記錄空閒記憶體地址的連結串列,以尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點連結串列中刪除,並將該結點的空間分配給程式。

棧(stack):存放程式的區域性變數,以及函式呼叫時候,棧用來傳遞引數和返回值。由於棧的先進後出的特點,特別方便用來儲存和回覆呼叫現場。

程式舉例:

inta=0;//全域性初始化區 char*p1;//全域性未初始化區
intmain(intargc,constchar*argv[]) { intb;//棧 chars[]="abc";//棧 char*p2;//棧 char*p3="123456";//123456\0在常量區,而p3在棧上
staticintc=0;//全域性(靜態)初始化區 p1=(char*)malloc(10); p2=(char*)malloc(20);//分配得來得10和20位元組的區域在堆區 strcpy(p1,"123456");//123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
return0; }