一个有意思的数组访问越界问题

首先,分析一下这段代码的输出结果:

#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.因此代码陷入了无限循环。

猜你喜欢

转载自www.cnblogs.com/khche/p/11883523.html