【问题标题】:influence of array pointer数组指针的影响
【发布时间】: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


【解决方案1】:

你还没有初始化数组,所以值是(或可以是)任意的

标准称它们为不确定值

使用您拥有的两个不同程序,您可以期望获得两个不同的值或相同的值,而没有明显的模式或原因(这是任意的)。您甚至可以从 same 程序的两次运行中获得不同的值。要初始化,只需编写

int a[100] = {};  // All zeroes. :-)

考虑使用 std::vector,而不是原始数组,例如

#include <vector>

// ...
std::vector<int> a( 100 );    // All zeroes

它总是自动初始化。

而且还可以调整大小。

【讨论】:

  • 我知道它来自哪里。我的主要问题是:不使用数组指针,尽管没有被初始化,我们永远得到“1”。但在使用数组指针后,我们得到“1219451320”,每次运行后都会发生变化。有什么不同?在他们两个中,数组都没有初始化!!
  • 只是程序不同而已。甚至不要期望第一个总是产生“1”。
  • 未定义的行为被定义为“本国际标准没有要求的行为”。没有要求它每次都以相同的方式运行。
  • @user554403 数组不是由你初始化的,但运行时会将它初始化为它想要的任何值。运行时,而不是编译器,所以你可以运行同一个程序十次,得到十个不同的值。
  • 不,到目前为止,每次在您的一台或多台机器上运行它时,它都会产生“1”。它随时可能改变。如果您更新编译器或操作系统,它可能会改变。如果你在不同的机器上运行,或者在满月期间运行,它可能会改变。
猜你喜欢
  • 2021-07-08
  • 2018-04-05
  • 2017-04-26
  • 1970-01-01
  • 2018-06-23
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多