C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 閱讀:6,866

C語言變量初始化是必須的嗎?不初始化會怎樣?

這個問題很重要!實際上前面講那么多,其中有一個很重要的目的就是為了講這個知識點。所謂初始化就是“第一次賦值”的意思。我們先來看一個程序:
#include <stdio.h>
int main(void)
{
    int i;
    printf("i = %d\n", i);
    return 0;
}
這里i沒有被賦值,只是定義了一個存儲空間。這時輸出這個空間的內容,你覺得輸出的值會是多少?是一個任意值嗎?可以通過編譯、鏈接、執行看一下,如下圖所示。


圖1:顯示一個警告

這時單擊圖 1 中圓圈標出的向上的箭頭,就可以看到警告的原因,如下圖所示。


圖2:顯示警告的原因

然后對著警告的那一行雙擊,在程序中就會標出是哪個地方發出警告,或者直接按 F4 鍵就可以直接在程序中標出警告的地方。如果是 error 報錯的話,同樣可以這么操作。

但需要注意的是:首先,圖 2 中警告的原因只是軟件自動檢測出來的,不一定是真正警告的原因;其次,標示出來的警告位置也不一定是真正警告的位置。因為軟件不可能百分之百的智能化,它只能推測。所以如果在標示出的位置找不到錯誤,那就往上幾行或下幾行看看。

現在來看一下它警告的內容是什么:

warning C4700: local variable 'i' used without having been initialized

warning 是警告;C4700 表示的是一個地址;local 是“本地的”,就是“局部的”意思。

我們看到警告的原因是,“局部變量 i 使用了,但是沒有給它初始化”,也就是說未初始化就使用它了。我們先不管警告,直接鏈接、執行,看結果是什么(使用 VC++ 6.0):
i = -858993460

如果i的值是任意值的話,那么再單擊一次“執行”顯示的應該是另一個值。但事實上不管重新執行多少次,還是這個值,這個值是不變的。下面就來討論一下原因。

前面講過,int i;運行的結果是將變量 i 和內存中的某一個單元產生關聯。然后變量 i 就代表那個內存單元了,要想操作該內存單元只需要通過變量i就可以了。

在上面程序中沒有給這個內存單元賦值就把它給輸出了,所以問題就出在這里。你只定義了變量 i,但是沒有給它賦值并把它輸出了。所以關鍵就是看看 i 里面放的到底是什么。

首先,內存條是一個硬件設備,硬件設備里面要么是 0 要么是 1。計算機肯定得通電,沒有電就運行不起來,有電之后它就會通過各種二極管、三極管之類的元器件產生高低電平。

如果電壓在某一個范圍之上,就認為是 1,在某一個范圍之下,就認為是 0。所以 1 就表示高電平,0 就表示低電平,即電壓的高或低產生 1 或 0。這時候只有兩種狀態,要么是 1,要么是 0。所以說 i 里面存放的就是由 0 和 1 組成的代碼,不可能里面什么都沒有!因為計算機要工作肯定得有電,有電就不可能是空的,有電就會轉化成 1 或 0 這樣的高低電平。所以硬件上要么是 1 要么是 0,不可能既不是 1 也不是 0,什么都沒有!計算機硬件沒有那種狀態,這也是為什么計算機只能識別二進制的原因。所以變量 i 所關聯的那內存單元里面肯定是由 0 和 1 組成的代碼。

這里 i 單元雖然沒有給它賦值,但這個空間在之前可能被其他軟件使用過。比如放電影的時候將電影中的某一部分數據放到了這個單元中。電影看完之后一關閉,這個單元空間就釋放了,即操作系統就會回收該內存空間,以便分配給其他軟件使用。

但需要注意的是,操作系統雖然回收了該內存空間,但它并不清空該內存空間中遺留下來的數據,這句話很重要。但這樣的話就會出現一個問題:以前的軟件如果使用過 i 這個空間的話,那么那些垃圾數據還在里面保留著,如果沒有初始化,那么它里面就應該是一個隨機的垃圾值。但是當我們多次執行的時候發現它不是一個隨機的值,而是一個不變的值。這是為什么呢?這個值叫“填充數字”或叫“填充字”。

微軟公司在設計 VC++ 這個軟件的時候,在它內部添加了一些特殊的處理。即如果發現一個變量里面存放的是一個垃圾值,就認為沒有給它賦初值,那么系統就會自動將一個很小的,如 –858993460 這個填充數字給放進去。所以我們看到的結果都是一個不變的值。

那么微軟公司為什么要這么設計?首先放入填充數字一定有好處!由于放入填充數字肯定會導致程序運行速度變慢,因為內部要進行處理。所以如果沒有好處的話微軟公司肯定不會這樣設計!

大家想想,如果之前使用i這個空間后遺留下來的數字是 5,那么輸出 5 后,你可能以為 i 里面存放的是一個有效的數據。但如果是一個很小的數字,這個數字基本上是很少有人使用的,那么你一看就知道可能是沒有初始化。所以這個數字就是提醒你變量沒有初始化。

綜上所述,任何一個變量在使用之前必須要先對它進行初始化。不初始化的話使用它就沒有實際意義了。在實際編程中,習慣上在定義變量的時候就對它進行初始化,這是一個很好的編程習慣。

但是按照 C89 標準,變量的定義只能在程序或復合語句的開頭。這樣就會有一個問題:“很多在開頭定義但到后面才會用到的變量,在定義的時候如何對它們進行初始化呢?”。此時習慣上將它們初始化為0,然后等后面真正用到它們的時候再重新賦值。當然,定義時不初始化也可以,等到后面知道該給它賦什么值的時候再給它賦值也行。但還是建議大家在定義時將它們初始化為 0,養成這個習慣。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo