关于C语言数组越界的演示程序

引子:

今天上课老师出了一道C语言数组越界的题目,虽然不难,但牵扯到内存分配和数组越界的相关知识,感觉自己真是孤陋寡闻啊,还以为都没办法运行呢。。回来试了一下,还正好遇到了点问题,下面总结一下~ PS:用codeblocks木有找到看内存的地方额。。。只能printf出来了。。。

代码:

#include <stdio.h>
main()
{
    int v1;
    int a[3];
    int v2;
    int i;
    v1 = 10;
    v2 = 20;
    printf("v1 addr = %x, array addr = %x, v2 addr = %x, i addr = %x\n",
           &v1, a, &v2, &i);
    printf("v1 = %d, v2 = %d\n", v1, v2);
    for(i=-1; i<=3; i++)
    {
        a[i] = i*2;
    }
    printf("v1 = %d, v2 = %d\n", v1, v2);
    return 0;
}

根据变量根据声明顺序存放在栈中,根据CPU的不同可能有所区别,我的CPU是intel i5的处理器,栈底是高地址,所以存放示意图如下:


结果如图所示:


问题:

如果修改声明顺序,内存分布自然也会不同,因为压入栈的先后发生了变化,可能造成意想不到的后果,比如修改为:
 int v1;
    int v2;
    int a[3];
    int i;

则内存分布示意图为:



程序运行结果如图所示,将运行不下去,进入死循环:



原因是在进入for循环时,语句 a[i] = i*2; 恰好修改了i(a[-1])的值,循环结束i++,即-2加一编程-1,i = -1继续死循环,我随手写的例子,还挺巧的呵呵~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值