数组 - >另一个空的int数组混乱

时间:2013-05-31 02:23:01

标签: c++ arrays int

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

以下是一个例子:

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 (来自评论):

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

2 个答案:

答案 0 :(得分:3)

由于您从未初始化或为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

答案 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放入{{1}的相应元素中}。这意味着即使它们具有相同的值,它们也不会引用相同的内存位置。

为了在修改empty_container时也修改empty1empty2,您必须修改empty_container并将其更改为指针数组或类似的方法参考一些对象。

The code

empty_container

请注意,#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