c語言變數賦值,初始化
阿新 • • 發佈:2019-02-10
陣列變數為全域性變數,或被部分初始化,均會出現這種情況。 C語言中,變數在沒有顯式初始化時,區分變數型別,有如下幾種情況: 1 全域性變數, 和靜態區域性變數,未初始化時值預設為0.無論是陣列還是變數,都是如此。 2 區域性變數,初始值為隨機值。
3 陣列類區域性變數,當被部分初始化時,未被初始化部分,值預設為0。
1.在C語言中,“初始化”和“賦值”是兩個不同的概念。樓主問題中應該是“初始化”而非“賦值”。
int a = 0; 在宣告一個變數的時候指定變數的值,這叫做初始化;
int a; a = 2; 這叫做賦值。
2.auto變數處於執行時堆棧。它的特點:在呼叫一個函式的過程中,這個函式內部的auto變數才存在,當這個函式呼叫結束時,這些變數所佔用的記憶體即被收回。如果多次呼叫一個函式,這個函式內部的auto變數在記憶體中的地址是不確定的。由於auto變數在記憶體中的地址不是一成不變的,所以在程式開始前,編譯器無法確定它們的值,並不對它們進行初始化。
因此,auto變數未被初始化時,編譯器也不知道你想要往這個變數裡存什麼,所以它的值是不確定的,毫無意義的,等著你在執行時給它進行賦值操作。
3.如果不對一個數組(非全域性的、非靜態的)進行初始化,這個和上面的變數未初始化一樣,編譯器不知道你要做什麼,所以懶得浪費時間對它們進行初始化。
如果對一個數組進行部分初始化,形如:
int a[10] = {1, 2, 3};
未被初始化的部分a[3]~a[9]便會被編譯器初始化為0。我的理解是,這是編譯器認為你只關心陣列a中前三個數的值,而後面的編譯器為了讓你省心就幫你初始化為0了,這時候編譯器想“反正你都讓我把前三個給填上了數,我也不怕麻煩了,後幾個我給你填0吧”,於是編譯器很大方地揮一揮衣袖把a[3]~a[9]填為0。
但是:
int a[10];
a[0] = 1;
a[1] = 2;
a[2] = 3;
這個時候a[3]~a[9]的值並不是0.因為這是執行時賦值,這個時候編譯器已經下班了,所a[3]~a[9]中的值也是不確定的。
4.最後,再說一下全域性變數和一個函式內部的靜態區域性變數,它們並不是儲存在執行時堆疊,在程式執行過程中,它們的在記憶體中地址是確定的,所以編譯器就把它們初始化為0。