1
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 的值。
4

2 回答 2

4

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

于 2015-08-24T14:57:02.107 回答
1

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

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

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

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

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

这将导致您的测试结果。

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

于 2015-08-24T15:15:30.497 回答