C语言变量的默认初始值


一个变量,即使不给它赋值,它也会有一个默认的值,这个值就是默认初始值

  • 对于全局变量,它的默认初始值始终是 0,因为全局变量存储在内存分区中的全局数据区(我们将在《C语言和内存》专题中讲解),这个区域中的数据在程序载入内存后会被初始化为 0
  • 而对于局部变量,C语言并没有规定它的默认初始值是什么,所以不同的编译器进行了不同的扩展,有的编译器会初始化为 0,有的编译器放任不管,爱是什么就是什么。请看下面的代码:
#include 
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 
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;
}