您的位置:首页 > 编程语言

Welcome to the Black Parade——关注代码背后的知识

2016-04-21 18:48 363 查看
【tip】

这是一篇初步潜入源代码身后,关注内存空间和地址分配的初级博,后续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!~ 欢迎来到黑色行军。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: