-3

我正在尝试将两个数组附加在一起。{0, 1, 2}当附加到第二个数组时,第一个数组应该{3, 4, 5}yield {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有一些如何变成这些奇怪的数字。std::cout然而,这通过我在 while 循环中添加任意语句以某种方式解决:

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

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

我再次打印数组并且它有效!:

5

0
1
2
3
4
5

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

编辑:

所以事实证明我在这里是未定义的行为。有了这个,我的问题仍然存在:为什么我的代码可以与std::coutwhile 循环内的调用一起工作?

4

3 回答 3

7

你正在超越arr2这里的界限:

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

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

于 2012-12-11T19:59:56.587 回答
1

当您像这样声明第二个数组时:

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

您给它的大小为 3。在这些范围之外写入是未定义的行为。

于 2012-12-11T20:00:09.733 回答
0

您在这里拥有的是未定义的行为

问题是arr2仅分配了 3 个项目,并且您在分配空间后编写:

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

您需要为数组分配更多空间,或者在堆上分配它,因此您可以使用realloc函数来更改其大小 - 或者,甚至更好,更多的 c++-ish - 使用std::vector<int>

于 2012-12-11T20:02:06.667 回答