【问题标题】:Why does not my program go into infinite loop when array out of bounds occur in C当 C 中出现数组越界时,为什么我的程序没有进入无限循环
【发布时间】:2015-08-24 14:55:08
【问题描述】:
int main(){
   int i;
   int arr[4];
   for(int i=0; i<=4; i++){
      arr[i] = 0;
   }
   return 0;
}
  1. 我在 youtube 上观看了 CS107(第 13 讲)的视频,其中显示了这个示例,并通过显示内存图告诉了为什么上述程序会导致无限循环。 arr[4] 越界,应该指向存储 i 的地址,并将 i 的值更改回 0,从而导致无限循环。但是当我尝试使用 gcc 编译器在我的 mac 上运行它时,for 循环执行了 5 次(通过插入 printf 检查)。即 i = 0,1,2,3,4 的值。

【问题讨论】:

  • 这是未定义的行为,除其他外,取决于编译器。当您遇到无限循环时,可能是因为i 的内存位置位于数组之后,而当您在数组之外写入0 时,您实际上将i 修改为零。为确保您必须查看编译器生成的汇编代码。
  • 是“解释我的 UB 实例”月吗?有通知吗?

标签: c infinite-loop memoryview


【解决方案1】:

当存在未定义的行为时,您不能指望单一或特定的行为。任何事情都有可能发生。
该视频中所说的只是未定义行为的众多可能性之一,而您得到的是另一种可能性。不应依赖任何特定的行为。

【讨论】:

    【解决方案2】:

    首先:这是未定义的行为,任何事情都可能发生。

    这么说,你应该尝试不同的优化级别。一种优化可以减少循环:

    for (i = 0; i <= 2; i++) arr[i] = 0;
    

    可以归约,因为i和arr[i]在循环范围内是不变的,为

    arr[0] = 0;
    arr[1] = 0;
    arr[2] = 0;
    

    这将导致您的测试结果。

    要考虑的另一件事是安排堆栈并将项目放置到堆栈上的架构(您不能依赖项目的顺序)

    【讨论】:

      猜你喜欢
      • 2014-11-17
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2017-05-12
      • 2018-08-21
      • 2023-03-22
      相关资源
      最近更新 更多