未初始化变量的价值是多少?

时间:2012-06-27 19:29:17

标签: c initialization garbage

  

可能重复:
  Is uninitialized data behavior well specified?

我尝试了以下代码

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

上面代码的输出是什么?

6 个答案:

答案 0 :(得分:9)

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

[参考1]
C99部分6.7.8初始化:

  

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

[参考2]

C99第3.18节未定义的行为:

  

使用不可移植或错误的程序构造时,对错误数据或不确定值的对象的行为,本国际标准不对其施加任何要求。

注意:强调我的。

答案 1 :(得分:4)

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

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


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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

未定义。不同的编译器,不同的操作系统,程序的不同运行,任何东西之间可能有所不同。它甚至可能不是特定值:允许编译器对此代码执行任何操作,因为效果未定义。它可能会选择优化您的整个程序。它甚至可能选择用安装程序更换你的程序,并窃取所有在线银行登录详细信息。

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

答案 5 :(得分:-1)

正如其他人所说,的值可以是

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

课程:始终初始化变量。 C#定义字段的值并且需要初始化局部变量。