引入一段错误的代码
int main()
{
int i = 0;
int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
for (i = 0; i < 13; i++)
{
a[i] = 0;
printf("嘻嘻\n");
}
return 0;
}
看到上面这段代码,我们的第一感觉是越界访问了,毕竟我们只声明了一个长度为10的数组,但是在循环之中它最多可以访问a[12],但是这个程序运行起来到底会是什么样呢?大部分人应该会和笔者一样,觉得会报错或者打印出13个“嘻嘻”,但果真如此吗?
程序最终陷入了死循环,怎么会这样呢?
我们通过调试发现,通过i=10,数组a进行了越界访问。
接下来神奇的事情发生了,当数组a越界访问到a[12]时,居然把i置0了。
这说明a[12]访问的区域是储存i的区域。
下面让我们用图来解释这个问题:
我们知道局部变量是储存在栈区之中的,储存的区域是从高地址区域到低地址区域,并且数组的储存和调用是从低地址区到高地址区,随着数组调用下标的增长,调用的地址升高。
最终越界之后更改了i的值,使得程序陷入死循环,因为程序无法结束也来不及报错。
大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注
大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注大佬关注