Welcome to the Black Parade——关注代码背后的知识
2016-04-21 18:48
363 查看
【tip】
这是一篇初步潜入源代码身后,关注内存空间和地址分配的初级博,后续Coder将会继续po出更多更深入了解源代码背后细节的文章。
【热身码】
for instance:
这是一道简单的数组下标越界问题,导致的结果是编译器会报错:
Coder使用的编译器是VS2015,编译器不同,出现的错误结果可能并不相同。有些编译器会出现死循环,这是由于不同编译器在地址空间的分配上有差别,接下来我们去查看它的地址空间分配——>
【Coder有话说】
老师总会说,一个好的程序猿,Ta的F10、F11等调试键一定被用的锃明瓦亮,我还不是一个合格的程序猿,我的调试键还很新。今天的问题很简单,我们不使用调试的方式,我们编码来分析地址分配问题:
如上代码,我们来观望 i 和 arr[i] 的地址分配,得到这样的结果:
如大家所知,变量从高地址开始创建。i的地址为0018FE4C,arr[10]的地址为0018FE44,中间未显示的0018FE48用于将arr数组和 i 隔开。按照数组的地址分配规律,我们可以猜测arr[11]的地址为0018FE48,这样下去,arr[12]的地址就为 i 的地址,当arr[12]在for循环中被置零时,相当于 i 被置零,for循环会回到初始化部分,导致循环一直不能跳出,死循环出现。为验证这一点,将for循环改为:
编译运行,结果是:
Bingo~事情一直朝着预想的方向在发展~地址分配就是这样的有条有理~
【结语】
回到开头,这一博初入地址内存,简单易懂不抽象。后续我们将继续深入了解神秘的地址世界,入编码坑的感觉就像是一首歌,Welcome to the Black Parade!~ 欢迎来到黑色行军。
这是一篇初步潜入源代码身后,关注内存空间和地址分配的初级博,后续Coder将会继续po出更多更深入了解源代码背后细节的文章。
【热身码】
for instance:
#include <stdio.h> int main() { int i = 0; int arr[10]; for (i = 0; i <=10; i++) { arr[i] = 0; printf("Welcome to Circle's blog!~\n"); } return 0; }
这是一道简单的数组下标越界问题,导致的结果是编译器会报错:
Coder使用的编译器是VS2015,编译器不同,出现的错误结果可能并不相同。有些编译器会出现死循环,这是由于不同编译器在地址空间的分配上有差别,接下来我们去查看它的地址空间分配——>
【Coder有话说】
老师总会说,一个好的程序猿,Ta的F10、F11等调试键一定被用的锃明瓦亮,我还不是一个合格的程序猿,我的调试键还很新。今天的问题很简单,我们不使用调试的方式,我们编码来分析地址分配问题:
int main() { int i, arr[10]; printf("%p\n", &i); for (i = 0; i <= 10; i++) { printf("&arr[%d]=%p\n", i, &arr[i]); } return 0; }
如上代码,我们来观望 i 和 arr[i] 的地址分配,得到这样的结果:
如大家所知,变量从高地址开始创建。i的地址为0018FE4C,arr[10]的地址为0018FE44,中间未显示的0018FE48用于将arr数组和 i 隔开。按照数组的地址分配规律,我们可以猜测arr[11]的地址为0018FE48,这样下去,arr[12]的地址就为 i 的地址,当arr[12]在for循环中被置零时,相当于 i 被置零,for循环会回到初始化部分,导致循环一直不能跳出,死循环出现。为验证这一点,将for循环改为:
for(i=0;i<=12;i++)
编译运行,结果是:
Bingo~事情一直朝着预想的方向在发展~地址分配就是这样的有条有理~
【结语】
回到开头,这一博初入地址内存,简单易懂不抽象。后续我们将继续深入了解神秘的地址世界,入编码坑的感觉就像是一首歌,Welcome to the Black Parade!~ 欢迎来到黑色行军。
相关文章推荐
- 20145127《java程序设计》第八周学习总结
- Spring MVC处理异常的4种方式
- golang入门--struct Tag的语法
- android studio 导入eclipse项目 之中文乱码
- PHP CI分页类带多个参数
- php获取内容中第一张图片地址
- java类加载机制
- 让Java swing 中的JTextArea换行
- pigpio-12c-python 学习笔记
- springboot servlet最佳例子
- spring配置文件详解
- unix编程(二)文件和目录
- [PDO绑定参数]使用PHP的PDO扩展进行批量更新操作
- 使用Eclipse的Generator MyBatis/iBatis Artifacts插件自动生成代码,与spring集成
- java学习之泛型
- struts2中的addActionError 、addFieldError、addActionMessage的方法
- java保留两位小数
- java并发之原子性、可见性、有序性
- Spark Streaming开发入门——WordCount(Java&Scala)
- 实用的Myeclipse10 优化设置