在while循环中使用std :: cout的奇怪行为

时间:2012-12-11 19:57:39

标签: c++

我正在尝试将两个数组附加在一起。附加到第二个数组{0, 1, 2}后的第一个数组{3, 4, 5}应该产生{0, 1, 2, 3, 4, 5}。在我继续之前,让我告诉你我的所作所为:

#include <iostream>

int main() {

    int i = 0;

    int arr1[] = {3, 4, 5}, arr2[] = {0, 1, 2};

    while (i < 3) {
        arr2[3 + i] = arr1[i];
        i++;
    }

    std::cout << std::endl;

    for (int i = 0; i < 6; i++) std::cout << arr2[i] << std::endl; // print

}

我认为我实施它的方式是正确的。但我发现当我打印出新数组的内容(arr2)时,这就是我得到的:

0
1
2
-1219315227
-1218166796
134514640

0, 1, 2是原始数组,但后来3, 4, 5有一些变成了这些奇怪的数字。但是,这在某种程度上是固定的,我在while循环中添加了一个任意的std::cout语句:

...
while (i < 3) {
    std::cout << 5 << '\n'; // just a random #

    arr2[3 + i] = arr1[i];
    i++;
}
...

我再次打印数组,它可以工作!:

5

0
1
2
3
4
5

我的问题是,当我在while循环中使用std::cout语句而不是不执行此操作时,为什么这会起作用,在这种情况下它会给我这些数字?

修改

所以事实证明我所拥有的是未定义的行为。有了这个,我的问题仍然存在:为什么我的代码在while循环中使用std::cout调用?

3 个答案:

答案 0 :(得分:7)

你超越了arr2的范围:

while (i < 3) {
    arr2[3 + i] = arr1[i];
    i++;
}

arr2的大小为3.您正在做的是未定义的行为。所有观察到的行为都与未定义的行为一致。

答案 1 :(得分:1)

当您声明第二个数组时:

arr2[] = {0, 1, 2};

你给它的大小为3.在这些界限之外写作是未定义的行为。

答案 2 :(得分:0)

您拥有的是未定义的行为

问题是arr2只分配给3个项目,而你是在分配空间后写的:

while (i < 3) {
    arr2[3 + i] = arr1[i];
    i++;
}

你需要为数组分配更多空间,或者在堆上分配它,这样你就可以使用realloc函数来改变它的大小 - 或者更好,更多c ++ - ish - 使用std::vector<int>