技術(shù)交流QQ群:1027579432酿联,歡迎你的加入终息!
1.C語言中分為下面幾個(gè)存儲(chǔ)區(qū)
- 棧(stack): 由編譯器自動(dòng)分配釋放
- 堆(heap): 一般由程序員分配釋放,若程序員不釋放贞让,程序結(jié)束時(shí)可能由OS回收
- 全局區(qū)(靜態(tài)區(qū)): 全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的周崭,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域,程序結(jié)束釋放喳张。
- 常量區(qū): 專門放常量的地方续镇,程序結(jié)束釋放。
2.注意的地方
- 在函數(shù)體中定義的變量通常是在棧上销部,用malloc, calloc, realloc等分配內(nèi)存的函數(shù)分配得到的就是在堆上摸航。在所有函數(shù)體外定義的是全局變量,加了static修飾符后不管在哪里都存放舅桩,都在全局區(qū)(靜態(tài)區(qū))酱虎;在所有函數(shù)體外定義的static變量表示在該文件中有效,不能extern到別的文件用江咳,在函數(shù)體內(nèi)定義的static表示只在該函數(shù)體內(nèi)有效逢净。另外,函數(shù)中的”adgfdf”這樣的字符串存放在常量區(qū)歼指。比如:
int a = 0; // 全局初始化區(qū)
char *p1; // 全局未初始化區(qū)
void main(){
int b; // 棧區(qū)
char s[]="abc"; // 棧區(qū)
char *p2; // 棧區(qū)
char *p3 = "123456"; // p3在棧區(qū); "123456\0" 在常量區(qū)
static int c = 0; // 全局(靜態(tài))初始化區(qū)
p1 = (char*)malloc(10); // 分配得來的10和20字節(jié)的區(qū)域就在堆區(qū)
p2 = (char*)malloc(20);
strcpy(p1, "123456"); // "123456\0" 放在常量區(qū)爹土,編譯器可能會(huì)將它與p3所指向的"123456"優(yōu)化成一個(gè)地方。
}
3.C++中分為以下幾個(gè)存儲(chǔ)區(qū)
- 棧(stack):就是那些由編譯器在需要的時(shí)候分配踩身,在不需要的時(shí)候自動(dòng)清除變量的存儲(chǔ)區(qū)胀茵。里面的變量通常是局部變量脯燃、函數(shù)參數(shù)等萝风。
- 堆(heap):就是那些由new分配的內(nèi)存塊斥杜,它們的釋放編譯器不去管曙痘,由我們的應(yīng)用程序去控制,一般一個(gè)new就要對應(yīng)一個(gè)delete峰锁。如果程序員沒有釋放掉步咪,那么在程序結(jié)束后侣诺,操作系統(tǒng)會(huì)自動(dòng)回收坷备。
- 自由存儲(chǔ)區(qū):就是那些由malloc等分配的內(nèi)存塊熄浓,它和堆是十分相似的,不過它是用free來結(jié)束自己的生命的省撑。
- 全局/靜態(tài)存儲(chǔ)區(qū):全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中赌蔑,在以前的C語言中俯在,全局變量又分為初始化的和未初始化的,在C++里面沒有這個(gè)區(qū)分了娃惯,它們共同占用同一塊內(nèi)存區(qū)跷乐。
- 常量存儲(chǔ)區(qū):這是一塊比較特殊的存儲(chǔ)區(qū),它們里面存放的是常量趾浅,不允許修改(當(dāng)然愕提,你要通過非正當(dāng)手段也可以修改)
4.堆vs棧
- 申請方式
- stack:由系統(tǒng)自動(dòng)分配。例如:聲明在函數(shù)中一個(gè)局部變量 int b; 系統(tǒng)自動(dòng)在棧中為b開辟空間
- heap:需要程序員自己申請皿哨,并指明大小揪荣,在C語言中malloc函數(shù),如p1 = (char *)malloc(10); 在C++中用new運(yùn)算符 往史,如int *p2 = new int(2);但是注意p1、p2本身是在棧中的
4.實(shí)戰(zhàn)
實(shí)例.png
A:保存在堆中的數(shù)據(jù)有:b,obj;保存在棧中的數(shù)據(jù)有:c,lhs,rhs,obj2,aa