在C/C++程序中一般有一下存儲區(qū):
1.棧,由編譯器自動分配釋放,一般指函數(shù)內(nèi)部的存儲空間。
2.堆,由程序員手動分配釋放,若未釋放,程序結(jié)束時會被由OS回收
代碼中通過new/malloc/relloc等顯示申請的內(nèi)存都屬于堆上,這些內(nèi)存需要手動的去free/delete
3.靜態(tài)存儲區(qū):全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。
4.常量存儲區(qū),這是一塊比較特殊的存儲區(qū),他們里面存放的是常量,不允許修改
在學習C語言的時候,絕大部分教材里一定會降到聲明變量的時候需要初始化。
int a;
printf("%d", a); //此時的輸出就可能是一個隨機值。
看一個例子:
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
為什么兩個a的地址一樣?
f和g兩個函數(shù)內(nèi)的a都是棧上的空間,f()執(zhí)行完后,那塊棧上空間,已經(jīng)被回收,標記為可用了。然后調(diào)用g(),g和f的大小是一樣的,沒出意外的話,g的棧地址還是從上次f的那塊開始,所以a地址一樣的。
為什么兩個a的值一樣?
棧空間被回收了,只是表示那塊地址可以被使用,但地址里的內(nèi)容,系統(tǒng)可不否則維護,在你釋放了后去檫除,所以g中的a指向了上次a的那塊地址,內(nèi)容還是那塊內(nèi)容。所以a的值還是1。
這就是變量初始化的意義。