在一段时间循环中使用std::cout的奇怪行为
Weird behavior with std::cout in a while loop
>我正在尝试将两个数组附加到一起。第一个数组{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>
!
相关文章:
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- std::cout输出int时出现编译错误
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 为什么我需要做'using namespace std'而不是"使用 std::cout"?
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- std::cout 来自多个线程
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- 使用 std::addressof(std::cout) 而不是 &std::cout 是否有任何风险?
- 是否可以为 std::cout 创建别名?
- std::cout 在打印变量与函数表达式时的行为不同
- 带有 std::cout 的多线程控制台文本动画
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- "std::cout << std::endl;"如何编译?
- std::cout/std::cerr seg faults