C语言变量的默认初始值
一个变量,即使不给它赋值,它也会有一个默认的值,这个值就是默认初始值。
- 对于全局变量,它的默认初始值始终是 0,因为全局变量存储在内存分区中的全局数据区(我们将在《C语言和内存》专题中讲解),这个区域中的数据在程序载入内存后会被初始化为 0。
- 而对于局部变量,C语言并没有规定它的默认初始值是什么,所以不同的编译器进行了不同的扩展,有的编译器会初始化为 0,有的编译器放任不管,爱是什么就是什么。请看下面的代码:
#includeint 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:
#includeint main(){ int a = 0; float f = 0.0; char c = 0; printf("a=%d, f=%f, c=%d\n", a, f, c); return 0; }