(1)代碼區(text segment)
用來存放程式的二進位代碼。
代碼區指令根據程式設計流程依次執行,對於順序指令,則只會執行一次(每個進程),如果反覆,則需要使用跳轉指令,如果進行遞迴,則需要藉助棧來實現。
代碼區的指令中包括作業碼和要操作的對象(或對象地址引用)。如果是立即數(即具體的數值,如5),將直接包含在代碼中;如果是局部資料,將在棧區分配空間,然後引用該資料地址;如果是BSS區(未初始化資料區)和資料區,在代碼中同樣將引用該資料地址。
(2)全域資料區/待用資料區(Data Segment)
只初始化一次。
記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個運行期間都存在。例如全域變數,static 變數。
(3)棧區(stack)
由編譯器自動分配釋放,存放函數的參數值、局部變數的值等。其操作方式類似於資料結構中的棧。每當一個函數被調用,該函數返回地址和一些關於調用的資訊,比如某些寄存器的內容,被儲存到棧區。然後這個被調用的函數再為它的自動變數和臨時變數在棧區上分配空間,這就是C實現函數遞迴調用的方法。每執行一次遞迴函式調用,一個新的棧架構就會被使用,這樣這個新執行個體棧裡的變數就不會和該函數的另一個執行個體棧裡面的變數混淆。
(4)堆區(heap)
用於動態記憶體分配。堆在記憶體中位於bss區和棧區之間。一般由程式員分配和釋放,若程式員不釋放,程式結束時有可能由OS回收。
new、malloc分配是在堆內分配。
例子
int a = 0; //全域區
void main()
{
int b; //棧
char s[] = abc; //s在棧,abc在文字常量區
char *p1,*p2; //棧
char *p3 = 123456; //123456在常量區,p3在棧上
static int c =0; //全域區
p1 = (char *)malloc(10); //p1在棧,分配的10位元組在堆
p2 = (char *)malloc(20); //p2在棧,分配的20位元組在堆
strcpy(p1, 123456); //123456放在常量區
}