【问题标题】:Why doesn't this for loop stop? [duplicate]为什么这个 for 循环不停止? [复制]
【发布时间】:2016-03-16 12:13:09
【问题描述】:

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

【问题讨论】:

  • 如果这是 gcc,请查看 C++ compilation bug?
  • 代码中的任何内容都与“try-catch 测试”无关。在 C++ 中产生可捕获异常的唯一方法是:1) 使用显式 throw,2) 使用指定用于引发 C++ 异常的标准语言功能。在 C++ 中,越界数组访问不会引发异常。它产生未定义的行为。您不能使用异常来捕获未定义的行为。
  • 查看示例 here 以测试您的 try catch 块

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


【解决方案1】:

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

【讨论】:

  • 你可以把它变成运行时错误,使用-fsanitize=undefined gcc 和 clang 都可以解决这个问题。
【解决方案2】:

我试图用这个来为 try-catch 测试产生一个错误 代码,我预计在访问 a[3] 时会出错(第四) 元素。即使没有收到错误,for循环也必须在之后停止 五次迭代,从未发生过。

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-12
      • 2015-01-10
      • 2016-08-22
      • 2016-10-16
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多