在C/C++程序中一般有一下存儲(chǔ)區(qū):
1.棧绞蹦,由編譯器自動(dòng)分配釋放萎馅,一般指函數(shù)內(nèi)部的存儲(chǔ)空間侣诺。
2.堆,由程序員手動(dòng)分配釋放假栓,若未釋放,程序結(jié)束時(shí)會(huì)被由OS回收
代碼中通過new/malloc/relloc等顯示申請(qǐng)的內(nèi)存都屬于堆上霍掺,這些內(nèi)存需要手動(dòng)的去free/delete
3.靜態(tài)存儲(chǔ)區(qū):全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的匾荆,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域杆烁。
4.常量存儲(chǔ)區(qū)牙丽,這是一塊比較特殊的存儲(chǔ)區(qū),他們里面存放的是常量兔魂,不允許修改
在學(xué)習(xí)C語言的時(shí)候烤芦,絕大部分教材里一定會(huì)降到聲明變量的時(shí)候需要初始化。
int a;
printf("%d", a); //此時(shí)的輸出就可能是一個(gè)隨機(jī)值析校。
看一個(gè)例子:
void f() {
int a = 1;
printf("address %p:%d", &a, a);
}
void g() {
int a ;
printf("address %p:%d", &a, a);
}
int main() {
f();
g();
return 0;
}
結(jié)果輸出:
address0x7fffbf281ea4:1
address0x7fffbf281ea4:1
為什么兩個(gè)a的地址一樣构罗?
f和g兩個(gè)函數(shù)內(nèi)的a都是棧上的空間铜涉,f()執(zhí)行完后,那塊棧上空間遂唧,已經(jīng)被回收芙代,標(biāo)記為可用了。然后調(diào)用g()盖彭,g和f的大小是一樣的纹烹,沒出意外的話,g的棧地址還是從上次f的那塊開始召边,所以a地址一樣的铺呵。
為什么兩個(gè)a的值一樣?
椪剖担空間被回收了陪蜻,只是表示那塊地址可以被使用,但地址里的內(nèi)容贱鼻,系統(tǒng)可不否則維護(hù)宴卖,在你釋放了后去檫除,所以g中的a指向了上次a的那塊地址邻悬,內(nèi)容還是那塊內(nèi)容症昏。所以a的值還是1。
這就是變量初始化的意義父丰。