第一、C的編譯器對(duì)內(nèi)存空間的劃分
這里,編譯器將內(nèi)存劃分成4個(gè)區(qū),分別是棧區(qū)、堆區(qū)、全局/靜態(tài)區(qū)、常量區(qū)。如果要更細(xì)地劃分,還可以添加一個(gè)自由存儲(chǔ)區(qū);把全局區(qū)看作兩部分,為初始化全局區(qū)和未初始化全局區(qū)。
第二、程序中出現(xiàn)的不同量在內(nèi)存中的保存
int a = 0; //a:全局初始化區(qū)
char *p1; //全局未初始化區(qū)
main()
{
int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; //"123456"在常量區(qū),p3在棧上。
static int c = 0; //全局(靜態(tài))初始化區(qū)
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。
//123456放在常量區(qū),編譯器可能會(huì)將它與p3所指向的"123456"優(yōu)化成一塊。
strcpy(p1, "123456");
}
第三、不同內(nèi)存區(qū)中的空間使用有什么特點(diǎn)
上訴程序,已經(jīng)給出了程序中出現(xiàn)的量,如何劃分存儲(chǔ)空間。說明如下:
1、棧 - 由編譯器自動(dòng)分配釋放,如我們定義了一個(gè)變量,由編譯器負(fù)責(zé)為它分配空間和回收。
2、堆 - 一般由程序員通過函數(shù)(malloc/free等)分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收
3、全局區(qū)(靜態(tài)區(qū))- 全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。同樣由編譯器分配釋放,不過釋放要等到程序結(jié)束時(shí)
4、常量存儲(chǔ)區(qū) - 編譯器負(fù)責(zé)管理,程序結(jié)束釋放
也就是說,C語(yǔ)言中,我們實(shí)際使用到,能對(duì)值發(fā)生改變的有堆、棧和全局區(qū),而真正能由我們自由分配和釋放的操作在堆區(qū)完成。
這里,編譯器將內(nèi)存劃分成4個(gè)區(qū),分別是棧區(qū)、堆區(qū)、全局/靜態(tài)區(qū)、常量區(qū)。如果要更細(xì)地劃分,還可以添加一個(gè)自由存儲(chǔ)區(qū);把全局區(qū)看作兩部分,為初始化全局區(qū)和未初始化全局區(qū)。
第二、程序中出現(xiàn)的不同量在內(nèi)存中的保存
int a = 0; //a:全局初始化區(qū)
char *p1; //全局未初始化區(qū)
main()
{
int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; //"123456"在常量區(qū),p3在棧上。
static int c = 0; //全局(靜態(tài))初始化區(qū)
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。
//123456放在常量區(qū),編譯器可能會(huì)將它與p3所指向的"123456"優(yōu)化成一塊。
strcpy(p1, "123456");
}
第三、不同內(nèi)存區(qū)中的空間使用有什么特點(diǎn)
上訴程序,已經(jīng)給出了程序中出現(xiàn)的量,如何劃分存儲(chǔ)空間。說明如下:
1、棧 - 由編譯器自動(dòng)分配釋放,如我們定義了一個(gè)變量,由編譯器負(fù)責(zé)為它分配空間和回收。
2、堆 - 一般由程序員通過函數(shù)(malloc/free等)分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收
3、全局區(qū)(靜態(tài)區(qū))- 全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。同樣由編譯器分配釋放,不過釋放要等到程序結(jié)束時(shí)
4、常量存儲(chǔ)區(qū) - 編譯器負(fù)責(zé)管理,程序結(jié)束釋放
也就是說,C語(yǔ)言中,我們實(shí)際使用到,能對(duì)值發(fā)生改變的有堆、棧和全局區(qū),而真正能由我們自由分配和釋放的操作在堆區(qū)完成。

