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

本文是一篇关于源代码和内存空间关系的初级探讨,通过一个简单的数组下标越界例子,揭示了不同编译器在地址分配上的差异,并通过编码分析验证了地址分配的规律,为理解程序运行提供了新的视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【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!~ 欢迎来到黑色行军。

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值