数组越界问题

源于极客时间数据结构
我看到评论区的答案各式各样,于是问了一位大佬,他和我说这是一个未定义行为,每台电脑内存和存储空间的分配方式不尽相同,不需要纠结。
大概,可能,类似于fflush这个方法,并不是在哪个编译器上都可以用  ̄□ ̄||

int main(int argc, char* argv[]){
    int i = 0;
    int arr[3] = {0};
    for(; i<=3; i++){
        arr[i] = 0;
        printf("hello world\n");
    }
    return 0;
}

疑问:这段代码的运行结果理论上是无限打印,实际上VS编译器中只打印了四次。

在 C 语言中,只要不是访问受限的内存,所有的内存空间都是可以自由访问的。根据我们前面讲的数组寻址公式,a[3]也会被定位到某块不属于数组的内存地址上,而这个地址正好是存储变量 i 的内存地址,那么 a[3]=0 就相当于 i=0,所以就会导致代码无限循环。

那么,为什么&arr[3]=&i呢?

因为,函数体内的局部变量存在栈上,而且是连续压栈。在Linux进程的内存布局中,栈区在高地址,且从高向低增长,那么实际上arr和i在内存中的状态如下表所示。

arr[0] arr[1] arr[2] i
posted @ 2022-10-03 11:37  mykaneki  阅读(31)  评论(0编辑  收藏  举报