首先,分析一下这段代码的输出结果:
#include <iostream> using namespace std; int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i <= 3; i++){ arr[i] = 0; cout << "Hello \n"; } return 0; }
注意:可以明显的看出arr数组的访问是越界的,猜测编译时可能会报错,实际结果,编译成功,无限循环输出。
这是和函数调用的栈结构有关的。函数体内的局部变量存在栈上,且是连续压栈。在Linux进程的内存布局中,栈区在高地址空间,从高向低增长。所以,i和数组的数据从高位地址到低位地址依次是:i, a[2], a[1], a[0]。a[3]通过寻址公式,计算得到地址正好是i的存储地址,即i和a[3]指向的是同一地址,任一个的改变都会联动到另一个,所以a[3]=0,就相当于i=0.因此代码陷入了无限循环。