为什么这个循环停止?

时间:2015-12-10 18:20:32

标签: c++ arrays for-loop undefined-behavior

我试图使用此代码为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

3 个答案:

答案 0 :(得分:7)

未定义的行为 UB ),您在阵列中没有(至少)五个元素。你不能抓住UB,例外是我们catch。这里没有什么可以辩论的,但请参阅评论部分中的有趣链接。

答案 1 :(得分:4)

  

我试图用try-catch测试产生错误   代码,我希望在访问[3]时遇到错误(第四个)   元件。即使没有得到错误,for循环也必须在之后停止   五次迭代,永远不会发生。

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

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

答案 2 :(得分:0)

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

Here是对未定义行为的更详细解释 - 其他答案正在引用。