可能重复:
未初始化的数据行为是否已明确指定?
我尝试了以下代码:
#include<stdio.h>
void main()
{
int i;
printf("%d",i);
}
结果在 VC++ 中给出垃圾值,而在 tc 中同样为零。 正确的值是多少? 默认情况下未初始化的变量的值是否为零?或者它会包含垃圾值?
下一个是相同的:
#include<stdio.h>
void main()
{
int i, j, num;
j = (num > 0 ? 0 : num*num);
printf("\n%d",j);
}
上面代码的输出是什么?
从技术上讲,未初始化的非静态局部变量的值是不确定[参考1]。
简而言之,它可以是任何东西。访问此类未初始化的变量会导致未定义的行为。[参考资料 2]
[参考 1]
C99第6.7.8节初始化:
如果一个具有自动存储期限的对象没有显式初始化,那么它的值是不确定的。
[参考 2]
C99 第 3.18 节未定义行为:
使用不可移植或错误的程序构造、错误数据或不确定值的对象时的行为,本国际标准对此没有强加任何要求。
注意:强调我的。
访问统一变量在 C 和 C++ 中都是未定义的行为,因此读取任何值都是可能的。
你的程序也有可能崩溃:一旦你进入未定义的行为领域,所有的赌注都会失败1。
1 我从未见过程序因访问未初始化的变量而崩溃,除非它是指针。
它是不确定的。编译器可以做它想做的事。
数值不确定;在初始化之前使用变量会导致未定义的行为。
这是未定义。不同的编译器、不同的操作系统、不同的程序运行等等之间可能会有所不同。它甚至可能不是一个特定的值:编译器可以对此代码执行任何它喜欢的操作,因为效果未定义。它可能会选择优化你的整个程序。它甚至可能选择用安装键盘记录器并窃取您所有网上银行登录详细信息的程序来替换您的程序。
如果你想知道这个值,唯一的方法就是设置它。
正如其他人所指出的,值可以是任何值。
这有时会导致难以发现的错误,例如因为您“碰巧”在调试版本中获取一个值,并在发布版本中获取不同的值,或者您获得的初始值取决于之前的程序执行。 教训:始终初始化变量。 C# 定义字段值并要求局部变量初始化是有原因的。