为什么循环不停止?



我试图用这段代码进行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

这是未定义的行为UB),您的数组中(至少)没有五个元素。你抓不到UB,例外就是我们catch。这里没有更多的争论,但请参阅评论部分的有趣链接。

我试图用这个为try-catch测试生成一个错误代码,我期望在访问[3](第四个)时出现错误要素即使没有得到错误,for循环也必须在五次迭代,但从未发生过。

在这种情况下,你不应该期望出现异常。有一类错误不会发生异常(甚至编译器也不需要告诉您这一点),但程序可能仍然无效。这是未定义的行为。

此外,在发生未定义行为时,您甚至可能没有注意到问题,相反,它可能会在稍后显示出来。

一个非常简单的答案是,您指定了一个数组的开头(内存中的一个地址),但从内存中的那个地址继续前进,经过您的三个数组元素。C++允许您超出数组的边界,并且不会给您一个异常。问题是,我们不知道在你的三个元素之后,记忆中会有什么。

以下是对未定义行为的更详细解释——其他答案都在参考。

最新更新