【发布时间】:2012-11-16 13:07:47
【问题描述】:
当我们有:
#include <iostream>
using namespace std;
int main()
{
int a[100];
cout << a[0] << endl;
}
我得到“1”。
但是当我这样改变它时:
#include <iostream>
using namespace std;
int main()
{
int a[100];
int* b = &a[0];
cout << a[0] << endl;
cout << *b << endl;
}
我得到类似“-1219451320”的信息,每次运行后都会发生变化。
b 变量的影响是什么,所以a[0] 发生了变化?例如现在,如果我将其更改为以前的代码,结果将再次为“1”。
在这两种状态下,数组都没有初始化!所以不应该有这样的区别。例如在第一个代码中,如果我们得到“-12242311231”,这并不奇怪,但现在......
【问题讨论】:
-
评估未初始化数组的元素无论如何都是未定义的行为...
-
未定义的行为是未定义的。您不能读取未初始化的变量并期望程序的行为有意义。
-
这并不是真正未定义的行为。这些值是不确定的,但是评估这些元素实际上会产生这些不确定的值,并且在同一程序运行期间对它们进行十次评估将产生十倍的相同值,所有这些都符合标准。如果行为未定义,我们将无法这么说。
-
你说得对,但关键是为什么它在不使用数组指针的情况下不显示其确定性。在这两种状态下,数组都是未初始化的,值应该是不确定的。
-
@Gorpik:标准对此非常明确:未初始化对象的左值到右值转换会产生未定义的行为(根据 C++11 4.1/1)。
标签: c++ arrays memory pointers