为什么我在c ++中得到不同的值?

时间:2015-07-19 15:37:23

标签: c++ gcc runtime

我得到的变量是一个int的不同值。 虽然我知道我没有初始化它,但是对于变量a(代码版本1),值的变化范围为32767 32766 32765和32764,而代码版本2的值始终为0。 我知道我不必保留未初始化的变量,只是问这个问题,看看是否有人知道在运行时幕后发生的事情,我正在使用gcc。

代码版本1

#include <iostream>

int main()
{
 int a;
 int *b = new int; //   <----- this line 
 std::cout<<a<<std::endl;
 std::cout<<*b<<std::endl;
 return 0;
}

代码版本2

#include <iostream>

int main()
{
 int a;
 std::cout<<a<<std::endl;
 int *b = new int; //    <----- same line moved here  
 std::cout<<*b<<std::endl;
 return 0;
}

3 个答案:

答案 0 :(得分:3)

您读取未初始化的内存。这是未定义的行为。这意味着C ++语言规则几乎不能保证在运行此代码时会发生什么。你可能会看到你观察到的值,什么都没有,崩溃你的电脑或让你的房子着火。运行此代码的所有同等法律结果。

实际上,这只会在int范围内打印不可预测的垃圾值,这取决于你的记忆中遗留的内容并没有任何有趣的事情。

非信徒的标准证明(N4140):

  

存储对象时   获得自动或动态存储持续时间,该对象具有不确定的值,如果   没有对该对象执行初始化,该对象保留一个不确定的值,直到该值为止   替换(5.17)。 [注意:具有静态或线程存储持续时间的对象是零初始化的,请参见3.6.2。 -   结束注释] 如果评估产生不确定的值,则行为未定义除外   以下情况:

[8.5(12)],强调我的,此后的例外不适用。

答案 1 :(得分:2)

高度复杂系统中,这是一个未经检查的巧合。

对于为什么计算机中未初始化的内存向您显示您看到的模式,这可能是您得到的最佳答案。

See also...

答案 2 :(得分:0)

c ++语句new int从堆中分配内存但不初始化它。因此,正在读取堆上的内容或之前的内存。您必须执行int *b = new int(0)来初始化b指向0的内容。