6

可能重复:
未初始化的数据行为是否明确指定?

我尝试了以下代码

#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);
}

上面代码的输出是什么?

4

6 回答 6

10

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

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

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

[参考 2]

C99 第 3.18 节未定义的行为:

在使用不可移植或错误程序结构、错误数据或不确定值对象时的行为,本国际标准对此没有任何要求。

注意:强调我的。

于 2012-06-27T19:31:02.660 回答
4

访问一个未初始化的变量在 C 和 C++ 中都是未定义的行为,因此可以读取任何值。

你的程序也有可能崩溃:一旦你进入未定义的行为领域,所有的赌注都没有1


1我从未见过程序因访问未初始化的变量而崩溃,除非它是指针。

于 2012-06-27T19:30:52.507 回答
2

这是不确定的。编译器可以为所欲为。

于 2012-06-27T19:30:44.097 回答
1

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

于 2012-06-27T19:31:27.760 回答
-1

它是未定义的。不同的编译器,不同的操作系统,不同的程序运行,任何东西之间可能会有所不同。它甚至可能不是一个特定的值:允许编译器对这段代码做任何它喜欢的事情,因为没有定义效果。它可能会选择优化你的整个程序。它甚至可能选择用安装键盘记录器并窃取您所有网上银行登录详细信息的程序替换您的程序。

如果您想知道该值,唯一的方法就是设置它。

于 2012-06-27T19:32:18.600 回答
-1

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

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

教训:总是初始化变量。C# 为字段定义值并要求对局部变量进行初始化是有原因的。

于 2012-06-27T19:32:51.193 回答