1. 程式人生 > 其它 >C語言變數的預設初始值

C語言變數的預設初始值

一個變數,即使不給它賦值,它也會有一個預設的值,這個值就是預設初始值

  • 對於全域性變數,它的預設初始值始終是 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:

  • #include <stdio.h>
  • 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;
  • }