当C中出现数组越界时,为什么我的程序不会进入无限循环

int main(){ int i; int arr[4]; for(int i=0; i<=4; i++){ arr[i] = 0; } return 0; } 
  1. 我观看了一个关于CS107(第13讲)的video,其中显示了这个例子,并告诉我为什么上面的程序会通过显示内存图导致无限循环。 arr [4]超出界限,应该导致存储i的地址,并将i的值更改回0,从而导致无限循环。 但是当我尝试使用gcc编译器在我的mac上运行它时,for循环执行(通过插入printf检查)5次。 即对于i = 0,1,2,3,4的值。

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

第一:它是未定义的行为,任何事情都可能发生。

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

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

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

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

这将导致您的测试结果。

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