C++ 为什么我在c++;?
我得到了一个变量的不同值,这个变量是int。 虽然我知道我没有初始化它,但变量a(代码版本1)的值从32767 32766 32765和32764更改,代码版本2的值始终为0。 我知道我不必让变量未初始化,只是问了这个问题,看看是否有人知道在运行时幕后发生了什么,我使用的是gcc 其代码版本1C++ 为什么我在c++;?,c++,gcc,runtime,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::cou
#include <iostream>
int main()
{
int a;
int *b = new int; // <----- this line
std::cout<<a<<std::endl;
std::cout<<*b<<std::endl;
return 0;
}
#包括
int main()
{
INTA;
It*B= new int;//p>读取未初始化的内存。这是未定义的行为。这意味着C++语言规则在保证运行代码时不会给出什么保证。您可能会看到您所观察到的值,根本没有,崩溃您的PC或设置您的房子着火。所有同样合法的结果运行这个代码。
实际上,这只会打印int
范围内不可预测的垃圾值,当然,这取决于内存中刚好剩下的内容,并且不做任何有趣的事情
非信徒的标准证明(N4140):
当存储对象时
如果获得自动或动态存储持续时间,则对象具有不确定值,如果
不为对象执行初始化,该对象保留一个不确定的值,直到该值被初始化为止
替换(5.17)。[注:静态或线程存储持续时间为零的对象初始化,见3.6.2-
结束注释]如果评估产生了不确定值,则行为未定义,但在
以下情况:
(8.5(12)),强调My,例外情况不适用。
< P> C++语句>代码> new int /COD>分配堆内存,但不初始化它。因此,无论从堆还是内存上读取什么,都必须执行<代码> int *B=新int(0)
初始化b所指向的0。在高度复杂的系统中,这是未经检查的巧合
这可能是关于为什么计算机中未初始化的内存会向您显示所看到的模式的最佳答案
您读取了一个未初始化的值=>您得到了未定义的行为。这里没有什么有趣的事情发生。如果您希望它为0,您可以执行int*i=new int();否则,您将得到内存位置中的任何内容好的,谢谢。只是不知道如果b变量是在第一行std::cout之后创建的,为什么a总是0。这更接近于我想要的答案。无论如何,谢谢。我知道我不应该问这样的问题。@HoNgOuRu嗯,虽然这是未定义的行为,但知道它总是很有趣的编译器生成的内容。如果您使用linux,请尝试以下操作:
g++-S-fverbose asm-o test\u asm.S test.cpp
,然后是as-alhnd test\u asm.S>test.lst
。您将获得编译器生成的汇编代码(也许它看起来很复杂,但我和我的朋友们发现了使用此方法产生指向常量行为的奇怪指针的原因)。为什么读取未初始化的变量会导致UB?读取垃圾值是否被视为未定义?@InQusitive是的。它不应该属于未指定的行为吗?@InQusitive不是,如果标准声明它是未定义的行为。它是这样的。我问的是“a”的值。然而,我意识到这是一个愚蠢的问题。“a”是一个未初始化的堆栈变量,因此它将打印堆栈上的任何值。
#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;
}