在一段时间循环中使用std::cout的奇怪行为

Weird behavior with std::cout in a while loop

本文关键字:cout std 循环 一段时间      更新时间:2023-10-16

>我正在尝试将两个数组附加到一起。第一个数组{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 调用一起使用?

你在这里超出了arr2的范围:

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

arr2的尺寸为 3。你正在做的是未定义的行为。所有观察到的行为都与未定义的行为一致。

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

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

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

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

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

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

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