我试图使用此代码为try-catch测试产生错误,我希望在访问a[3]
(第四)元素时出错。即使没有得到错误,for循环也必须在五次迭代后停止,这种迭代永远不会发生。
int a[3] = {1, 2, 3};
for(int i = 0; i < 5; i++)
{
std::cout << i << ": " << a[i] << std::endl;
}
输出:
0: 1
1: 2
2: 3
3: 1970756548
4: 4201552
5: 2686800
6: 2130567168
7: 0
8: 0
9: 2686824
10: 4198992
.
.
.
4150: 0
4151: 0
4152: 0
4153: 0
4154: 0
答案 0 :(得分:7)
未定义的行为( UB ),您在阵列中没有(至少)五个元素。你不能抓住UB,例外是我们catch
。这里没有什么可以辩论的,但请参阅评论部分中的有趣链接。
答案 1 :(得分:4)
我试图用try-catch测试产生错误 代码,我希望在访问[3]时遇到错误(第四个) 元件。即使没有得到错误,for循环也必须在之后停止 五次迭代,永远不会发生。
在这种情况下,您不应该预料到异常。有一类错误没有发生异常(甚至编译器也不需要告诉你这个),但程序可能仍然无效。这是未定义的行为。
此外,您可能甚至没有注意到未定义行为发生时的问题,而是稍后可能会显示出来。
答案 2 :(得分:0)
一个非常简单的答案是你指定了一个数组的开头(内存中的一个地址),但继续从内存中的那个地址前进 - 超过你的三个数组元素。 C ++允许您超出数组的范围并且不会给您一个例外。问题是我们不知道你的三个要素之后会在记忆中发生什么。
Here是对未定义行为的更详细解释 - 其他答案正在引用。