首页 > 其他分享 >数组越界问题

数组越界问题

时间:2022-10-03 11:44:55浏览次数:50  
标签:问题 arr int 越界 编译器 内存 数组 内存地址

源于极客时间数据结构
我看到评论区的答案各式各样,于是问了一位大佬,他和我说这是一个未定义行为,每台电脑内存和存储空间的分配方式不尽相同,不需要纠结。
大概,可能,类似于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

标签:问题,arr,int,越界,编译器,内存,数组,内存地址
From: https://www.cnblogs.com/mykaneki/p/16750218.html

相关文章