-
代碼區
程序被操作系統加載到內存時,所有可執行的代碼被加載到代碼區,也叫代碼段,存儲程序的代碼指令。程序運行時,這段區域數據不可被修改只可以被執行。
-
靜態區
程序中的靜態變量、全局變量存放在此區域(初始化的全局變量和靜態變量在一塊區域)。代碼執行期間一直占用內存!
-
堆
堆是不連續的內存區域,獲得的空間比較靈活,也比較大,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。需要程序員申請的內存空間,空間的釋放一般由程序員控制(比如new, delete, malloc, free)。當程序員沒有釋放該內存空間的時候,程序運行完畢時操作系統會對該內存空間進行回收。
-
棧
棧是一塊連續的內存的區域,一般棧的大小都是預先設置好的,如果申請的空間超過棧的剩余空間時,將提示overflow。存放的通常是變量通常是局部變量、函數參數等。
-
文字常量區
常量字符串就是放在這里的。 程序結束后由系統釋放。
-
bss段
定義而沒有賦初值的全局變量和靜態變量,放在這個區域,通常只是記錄變量名和大小,相當於一個占位符。
一個程序本質上都是由 .bss
段、.data
段、.text
段三個組成的。.data
段包含三個部分:heap(堆)、stack(棧)和靜態數據區。.text
段存放代碼區。.bss
里面裝載了未被初始化的數據;如圖:
int a = 0; //全局初始化區(靜態區)
char *p1; //全局未初始化區 (BSS段)
int main()
{
int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; //123456/0在常量區,p3在棧上。
static int c = 0; //全局(靜態)初始化區 (靜態區)
p1 = (char *)malloc(10); //分配得10和20字節的區域就在堆區。
p2 = (char *)malloc(20);
strcpy(p1, "123456");
//123456/0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一塊。
return 0;
}
可以聯合之前所寫的關於鏈接的一些總結,引用那張圖如下: