int main(){
int i;
int arr[4];
for(int i=0; i<=4; i++){
arr[i] = 0;
}
return 0;
}
- 我在youtube上观看了CS107(第13课)的视频,其中展示了这个例子,并通过显示内存图告诉了为什么上面的程序会导致无限循环。Arr[4]越界,应该指向存储I的地址,并将I的值更改为0,从而导致无限循环。但是当我试图在我的mac上运行这个使用gcc编译器,for循环执行(通过插入printf检查)5次。即对于I的值= 0,1,2,3,4。
当存在未定义行为时,您不能期望单个或特定的行为。什么事都有可能发生。
在那个视频中所说的只是未定义行为的许多可能性之一你得到的是另一种可能性。一个人不应该依赖于任何特定的行为
首先:这是未定义的行为,任何事情都可能发生。
说,你应该尝试不同的优化水平。有一个优化可以减少循环:
for (i = 0; i <= 2; i++) arr[i] = 0;
可以简化为
,因为I和arr[I]在循环范围内是不变的。arr[0] = 0;
arr[1] = 0;
arr[2] = 0;
会导致你的测试结果。
另一件要考虑的事情是安排堆栈并将项放置到堆栈上的体系结构(您不能依赖于项的顺序)