1 //main.cpp
2 int a = 0; //a,全局變量,存儲在全局初始化區
3 char *p1; //p1,全局變量指針,全局未初始化區(注意,p1沒有new或者malloc,它是一個空指針,你亂用就是野指針,但是它是地址,本身也占32位的空間)
4 void main()
5 {
6 int b; //main()函數的棧區
7 char s[] = "abc"; //main()函數的棧區
8 char *p2; // p2也是指針,main()函數的棧區
9 char *p3 = "123456"; //123456\0在常量區,p3在main()函數的棧區
10 static int c =0; //全局(靜態)初始化區
11 p1 = (char *)malloc(10);
12 p2 = (char *)malloc(20); //分配得來得10和20字節的區域就在堆區。但是p1在全局區,p2在main()函數的棧區,你懂了嗎?
13 strcpy(p1, "123456"); // 123456\0放在常量區,編譯器可能會將它與p3所指向 的"123456"優化成一個地方
14 }
上面的一小段代碼,可以看出,一段代碼占用內存,基本有一下幾種:
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。
3、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 - 程序結束后由系統釋放。
4、文字常量區 —常量字符串就是放在這里的。 程序結束后由系統釋放 。
5、程序代碼區—存放函數體的二進制代碼。