引子:
今天上课老师出了一道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;
}

结果如图所示:

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

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

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