我得到的变量是一个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;
}
答案 0 :(得分:3)
您读取未初始化的内存。这是未定义的行为。这意味着C ++语言规则几乎不能保证在运行此代码时会发生什么。你可能会看到你观察到的值,什么都没有,崩溃你的电脑或让你的房子着火。运行此代码的所有同等法律结果。
实际上,这只会在int
范围内打印不可预测的垃圾值,这取决于你的记忆中遗留的内容并没有任何有趣的事情。
非信徒的标准证明(N4140):
存储对象时 获得自动或动态存储持续时间,该对象具有不确定的值,如果 没有对该对象执行初始化,该对象保留一个不确定的值,直到该值为止 替换(5.17)。 [注意:具有静态或线程存储持续时间的对象是零初始化的,请参见3.6.2。 - 结束注释] 如果评估产生不确定的值,则行为未定义除外 以下情况:
[8.5(12)],强调我的,此后的例外不适用。
答案 1 :(得分:2)
答案 2 :(得分:0)
c ++语句new int
从堆中分配内存但不初始化它。因此,正在读取堆上的内容或之前的内存。您必须执行int *b = new int(0)
来初始化b指向0的内容。