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