【问题标题】:array -> another empty int array confusionarray -> 另一个空 int 数组混淆
【发布时间】:2013-05-26 18:37:41
【问题描述】:

考虑以下情况,您有两组数组 - 其中一组包含一些存储有值的整数,您可以将它们放入数组中并轻松计算数组中的值。但是,当您有一个包含空整数的数组时 - 它似乎无法将值“存储”到整数值 - 为什么?

这是一个例子:

int empty1;
int empty2;
int contain1 = 100;
int contain2 = 200;
int container [2] = { contain1, contain2 };
int empty_container [2] = { empty1, empty2 };
int i = 0;
while ( i != 2 ) {
    empty_container[i] = i;
    cout << endl << "empty_container[i]: " << empty_container[i] << endl
    << "empty1: " << empty1 << endl << "empty2: " << empty2 << endl;
    cout << "i: " << i << endl;
    cout << "container[i]: " << container[i] << endl;
    cout << "contain1: " << contain1 << endl;
    cout << "contain2: " << contain2 << endl;
    i++;
}

输出:

empty_container[i]: 0
empty1: 4197341
empty2: 0
i: 0
container[i]: 100
contain1: 100
contain2: 200

empty_container[i]: 1
empty1: 4197341
empty2: 0
i: 1
container[i]: 200
contain1: 100
contain2: 200

请注意,empty1 的值是“4197341”,而 empty2 为 0,这是怎么回事?

UPD(来自 cmets):

我的意思是像之前声明一个整数然后通过数组设置它 - 这在 C++ 中是不可能的吗?

【问题讨论】:

  • Empty 1 就是我们所说的垃圾。该整数未初始化,因此您的 IDE(即 Visual Studio)分配了一个随机(即垃圾)值作为占位符。
  • “空整数” 不是一个东西。至少在您谈论标准整数类型时不会。
  • 对不起,我的意思是像之前声明一个整数,然后通过数组设置它 - 这在 C++ 中是不可能的吗?
  • 欢迎来到未定义行为最美妙的土地!请尽情享受您的住宿。
  • dusz,你的意思是在打印之前覆盖empty_container[i] = i 吗?

标签: c++ arrays int


【解决方案1】:

因为您从未对empty1empty2 进行初始化或赋值。 empty1empty2 没有全局或静态存储,它们不会被隐式初始化。它们都包含垃圾值。

你有undefined behavior。你可以看到这个编译器在empty1empty2 的值上给出了不同的结果:Local variable not initialized Demo

永远记得在使用它之前初始化变量。

编辑:

我的意思是像之前声明一个整数,然后通过一个数组设置它——这在 C++ 中是不可能的吗?

恕我直言,你不能那样做。您可以使用给定的初始化变量初始化数组元素。但是,你做了什么:

 int empty_container [2] = { empty1, empty2 };

不会为 empty1empty2 分配具有该数组中的值的值,因为该数组本身未初始化。

但是,您可以尝试以下方法:

empty_container[2] = {10}; //initialize array at first
empty1 = empty_container[0];
empty2 = empty_container[1]; //this will give you empty1 10 and empty2 0

在此处查看另一个现场演示:Array and Variable initialization demo

【讨论】:

  • 我认为这不是 OP 所要求的。请查看更新后的问题。
  • @soon 啊,没有注意到更新的问题。现在将尝试更新帖子。
  • @taocp 抱歉不清楚 - 现在是凌晨 04:45。这仍然是有用的信息 +1 :)
【解决方案2】:

在这里

...
int i = 0;
while ( i != 2 ) {
    empty_container[i] = i;  // <- HERE
    cout << endl << "empty_container[i]: " << empty_container[i] << endl
...

你一定认为empty_container[i] = i 也会影响empty1empty2。看来你想错了。

在 C++ 中,将int empty_container [2] = { empty1, empty2 }; 复制 empty1empty2 的值到empty_container 的相应元素中。这意味着即使它们具有相同的值,它们也不会引用相同的内存位置。

为了在修改empty_container时同时修改empty1empty2,必须修改empty_container并将其更改为指针数组,或一些类似的方法来引用某个对象。

The code:

#include <iostream>

using namespace std;


int main() {
    int empty1;
    int empty2;
    int contain1 = 100;
    int contain2 = 200;
    int container [2] = { contain1, contain2 };
    int* empty_container [2] = { &empty1, &empty2 };
    // ^ Notice this
    int i = 0;
    while ( i != 2 ) {
        *(empty_container[i]) = i;
    //  ^ Also this
        cout << endl << "empty_container[i]: " << empty_container[i] << endl
        << "empty1: " << empty1 << endl << "empty2: " << empty2 << endl;
        cout << "i: " << i << endl;
        cout << "container[i]: " << container[i] << endl;
        cout << "contain1: " << contain1 << endl;
        cout << "contain2: " << contain2 << endl;
        i++;
    }
}

注意empty1 在第一次迭代中变为0,在第二次迭代中empty2 变为1

【讨论】:

  • *(empty_container[i]) = i; - 此处不需要括号,[] 的优先级高于取消引用运算符。
  • @soon 这对编译器来说可能是不必要的,但是当人类阅读这类代码时并不总是那么清楚。
  • 谢谢你,它确实有效。现在我还有一些东西要读:)
  • @dusz “现在我还有一些东西要读”。很好!将经验与经验结合起来就是成为一名优秀程序员所需要的一切。阅读然后申请!
猜你喜欢
  • 2019-06-18
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多