C 编译中的未定义行为
在给定的代码中,预期的行为是从索引 0 到 3 迭代数组 mc 并输出值,产生数字序列“0、1、2、3”。然而,观察到的行为是一个无限循环,输出一系列无休止的“0, 1, 2, 3, ....”。
问题的根源在于赋值语句 delta = mc[迪]。此操作尝试访问超出其有效索引的数组 mc,特别是在索引 4(越界)处。在 C 中,此类访问会调用未定义的行为,从而允许编译器以不可预测的方式运行。
在这种情况下,启用优化的编译器(例如,使用 -O2 标志)假定没有未定义的行为发生。具体而言,推断di<1。 4 始终为真,因为越界访问 mc[di] 将是未定义的。
此假设会导致激进的循环优化。在优化后的代码中,di
使用 -fno-aggressive-loop-optimizations 标志关闭激进循环优化会导致编译器按预期运行。它可以识别潜在的未定义行为并防止有问题的优化。
需要注意的是,C 中的未定义行为可能会产生不可预测且潜在有害的后果。建议避免依赖未定义的行为并编写符合语言规范的代码。
以上是为什么我的 C 循环在访问越界数组时会永远运行?的详细内容。更多信息请关注PHP中文网其他相关文章!