- 棧(stack):又稱堆棧,棧是由編譯器自動分配釋放,存放函數的參數值,局部變量的值等(但不包括static聲明的變量,static意味著在數據段中存放變量)。除此之外,在函數被調用時,棧用來傳遞參數和返回值。由于棧的先進后出的特點,所以棧特別方便用來保存/恢復調用數據。其操作方式類似于數據結構中的棧。
- 堆(heap):堆是用于存放進程運行中被動態分配的內存段,它的大小,并不固定,可動態擴張或縮放。當進程調用malloc/free等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張)/釋放的內存從堆中被提出(堆被縮減)。堆一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。
- 全局數據區(靜態區)(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和靜態變量在相鄰的另一塊區域。另外文字常量區,常量字符串就是放在這里,程序結束后由系統釋放。
(1) BSS段(bss segment):通常是指用來存放程序中未初始化的全局變量的一塊內存區域。BSS段屬于靜態內存分配。
(2) 數據段(data segment):通常是指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬于靜態內存分配。 - 代碼段(code segment/text segment):通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行之前就已經確定,并且內存區域通常屬于只讀,某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。程序段為程序代碼在內存中的映射,一個程序可以在內存中有多個副本。
C語言中內存分布.jpg
例如:
int a = 0; //全局初始化區
char *p1; //全局未初始化區
int main() {
int b; // 棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; //123456\0在常量區,而p3在棧上。
static int c =0; //全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得來得10和20字節的區域就在堆區。
strcpy(p1, "123456"); //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
return 0;
}