什么是未初始化variables的值?

可能重复:
未初始化的数据行为指定得很好吗?

我试了下面的代码

#include<stdio.h> void main() { int i; \ printf('%d',i); } 

结果在VC ++中给出了垃圾值,而tc中的值是零。 什么将是正确的价值? 未初始化的variables的默认值是零吗? 或者它会包含垃圾值?

接下来是一样的

 #include<stdio.h> void main() { int i,j,num; j=(num>0?0:num*num); printf("\n%d",j); } 

上面的代码的输出是什么?

从技术上讲,未初始化的非静态局部variables的值是Indeterminate [Ref 1]
总之它可以是任何东西。 访问这样一个未初始化的variables会导致未定义的行为[参考2]

[参考1]
C99第6.7.8节初始化:

如果具有自动存储持续时间的对象未被显式初始化,则其值是不确定的。

[参考2]

C99第3.18节未定义的行为:

行为,使用不可移植或错误的程序结构,错误的数据,或不确定的价值的对象 ,本标准没有要求。

注意:强调我的。

访问单位variables在C和C ++中都是未定义的行为,所以读取任何值都是可能的。

您的程序崩溃也有可能:一旦进入未定义的行为区域,所有投注都将closures。


1我从来没有见过一个程序崩溃访问一个uninitalizedvariables,除非它是一个指针。

这是不确定的。 编译器可以做它想做的事情。

价值是不确定的; 在初始化之前使用variables会导致未定义的行为。

这是未定义的 。 不同的编译器,不同的操作系统,程序的不同运行,任何东西都可能不同。 它甚至可能不是一个特定的值:编译器被允许做任何它喜欢的代码,因为效果没有定义。 它可能会select优化你的整个程序。 它甚至可能select用一个安装键盘logging器来replace你的程序,并窃取你所有的在线银行login信息。

如果你想知道价值,唯一的办法就是设置它。

正如其他人所指出的,价值可以是任何东西。

这有时会导致难以发现的错误,例如,因为您碰巧在debugging版本中获得了一个值,并在发布版本中获得了不同的值,或者您获得的初始值取决于以前的程序执行。

课程:始终初始化variables。 有一个原因,C#定义了字段的值,并需要本地variables的初始化。