博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
讨论一个堆栈越界的问题
阅读量:6823 次
发布时间:2019-06-26

本文共 648 字,大约阅读时间需要 2 分钟。

我们先看一个linux下的C代码,分析一下运行结果:

1 int main(int argc, char* argv[]) {2     int i = 0;3     int arr[3] = {0};4     for(; i<=3; i++) {5         arr[i] = 0;6         printf("hello world\n");7     }8     return 0;9 }​

显然,由于数组越界导致行为未知?

其实,行为虽然非法,但并不是未知或者因为非法访问而退出。

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

看到这里,应该还有很多疑问,但是还是请先思考一下。

我们再进一步,函数体内的局部变量存在栈上,且是连续压栈。在Linux进程的内存布局中,栈区在高地址空间,从高向低增长。变量 i 和 arr 在相邻地址,且 i 比 arr 的地址大,所以 arr 越界正好访问到 i。当然,前提是 i 和 arr 元素同类型,否则那段代码仍是未决行为。

看到这里,应该大体的原因已经说清楚了,那么如果想了解的更加深入,我给大家推荐一个链接:

最后,给大家再留一个思考:如果 arr[3] 变成 arr[5],结果是否还会无限循环呢?

图片描述

转载地址:http://fzlzl.baihongyu.com/

你可能感兴趣的文章
IDE 插件新版本发布,开发效率 “biu” 起来了
查看>>
阿里云安全肖力:安全基础建设是企业数字化转型的基石
查看>>
Redis 基础、高级特性与性能调优
查看>>
BZT52C15S资料
查看>>
Laravel Telescope入门教程(上)
查看>>
Linux配置ip 及网络问题排查
查看>>
AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)
查看>>
OSChina 周四乱弹 ——黑丝短裙java程序员同事
查看>>
设置iptables之后不能正常访问ftp解决方法
查看>>
移动端rem布局
查看>>
jsp与iframe跨域访问的一个方法
查看>>
ViewPager + Fragment 取消预加载
查看>>
BigDecimal 02 - 注意事项
查看>>
用js玩桌球游戏
查看>>
maven下运行jetty报错
查看>>
android 配置framework 使应用首选安装在SD卡
查看>>
h5 点击表单 顶部fixed 菜单栏 上移
查看>>
windows 2008 R2 64位系统杀毒软件
查看>>
我的友情链接
查看>>
netty学习笔记
查看>>