C語言變數的預設初始值
阿新 • • 發佈:2022-05-16
一個變數,即使不給它賦值,它也會有一個預設的值,這個值就是預設初始值。
- 對於全域性變數,它的預設初始值始終是 0,因為全域性變數儲存在記憶體分割槽中的全域性資料區(我們將在《C語言和記憶體》專題中講解),這個區域中的資料在程式載入記憶體後會被初始化為 0。
- 而對於區域性變數,C語言並沒有規定它的預設初始值是什麼,所以不同的編譯器進行了不同的擴充套件,有的編譯器會初始化為 0,有的編譯器放任不管,愛是什麼就是什麼。請看下面的程式碼:
#include <stdio.h> int main(){ int a; float f; char c; printf("a=%d, f=%f, c=%d\n", a, f, c); return 0; }
- 在 VS2010 下的執行結果:
a=1323060, f=0.000000, c=115
- 在 VS2015 下的執行結果:
a=0, f=0.000000, c=109
- 在 Linux GCC 下的執行結果:
a=32767, f=0.000000, c=0
- 在 Xcode 下的執行結果:
a=24630, f=0.000000, c=95
- 在 iOS 手機編譯器下的執行結果:
a=0, f=0.000000, c=0
你看,不同的編譯器對區域性變數的處理差異很大,
- 有的將 int 型別初始化為 0,
- 有的將 char 型別初始化為 0,
- 有的全部初始化為 0,有的全部放任不管。
這就告訴我們,使用區域性變數之前一定要手動初始化(賦值),千萬不敢假設它的值就是 0,不初始化就使用區域性變數會導致匪夷所思的結果 。
使用未初始化的區域性變數有很大風險,很多編譯器會給出警告,提醒程式設計師注意。
那麼,為什麼不初始化為 0 的區域性變數會有一個奇怪的值?放任不管又意味著什麼呢?
變數定義時會給變數分配一塊記憶體空間,如果不對變數進行初始化,那就意味著不對這塊記憶體進行寫入操作,這塊記憶體的資料會保持不變,依然是分配之前的資料。這樣的資料可能是當前程式在之前的執行過程中產生的,也可能是之前執行過的其它程式產生的,我們根本無法預測這樣的資料到底是什麼,所以你會看到它是一個毫無意義的值,這樣的值是隨機的,是垃圾值,沒有使用價值。
更改上面的程式碼,將所有的區域性變數手動初始化為 0:
- int main(){
- int a = 0;
- float f = 0.0;
- char c = 0;
- printf("a=%d, f=%f, c=%d\n", a, f, c);
- return 0;
- }