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

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

2013-04-17 21:25 211 查看

引子:

今天上课老师出了一道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继续死循环,我随手写的例子,还挺巧的呵呵~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: