数组越界问题
源于极客时间数据结构
我看到评论区的答案各式各样,于是问了一位大佬,他和我说这是一个未定义行为,每台电脑内存和存储空间的分配方式不尽相同,不需要纠结。
大概,可能,类似于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 |
---|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】