- 棧(stack):又稱堆棧,棧是由編譯器自動分配釋放,存放函數的參數值,局部變量的值等(但不包括static聲明的變量,static意味着在數據段中存放變量)。除此之外,在函數被調用時,棧用來傳遞參數和返回值。由於棧的先進後出的特點,所以棧特別方便用來保存/恢復調用數據。其操作方式類似於數據結構中的棧。
- 堆(heap):堆是用於存放進程運行中被動態分配的內存段,它的大小,並不固定,可動態擴張或縮放。當進程調用malloc/free等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張)/釋放的內存從堆中被提出(堆被縮減)。堆一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
- 全局數據區(靜態區)(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和靜態變量在相鄰的另一塊區域。另外文字常量區,常量字符串就是放在這裏,程序結束後由系統釋放。
(1) BSS段(bss segment):通常是指用來存放程序中未初始化的全局變量的一塊內存區域。BSS段屬於靜態內存分配。
(2) 數據段(data segment):通常是指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬於靜態內存分配。 - 代碼段(code segment/text segment):通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行之前就已經確定,並且內存區域通常屬於只讀,某些架構也允許代碼段爲可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。程序段爲程序代碼在內存中的映射,一個程序可以在內存中有多個副本。
#include <stdio.h>
int a = 0; //全局初始化區
char *p1; //全局未初始化區
int main(void)
{
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;
}