自身对C语言数组越界访问的简易理解
先看一个程序
#include <stdio.h>
int main()
{
int arr [ 10 ] = { 0 } ;
int i = 0 ;
for ( i = 0 ; i < 13 ; i ++ )
{
arr [ i ] = 0 ;
printf ( " hehe\n" ) ;
}
return 0 ;
}
大家猜猜这个程序如果编译链接会出现什么结果?
如上图,便是此代码的运行结果,发现是个死循环。这是为什么呢?
这个究竟是什么原因造成的呢?我对程序逐步运行进行监视,并进行查找 i 的值的变化情况发现,当 i < 13 时,如下;
当 i = 9时按道理来说数组内元素已经访问完全了,应该不会进行下去,但是却并不是这样的,
此时的 i 已经到达了10,甚至是12,也就是说这个时候arr[10]以及arr[12]还是有某些非数组元素的东西的,接着继续运行,令人惊讶的一幕出现了。
在 i ++进行到 12 时,经过 arr[12]=0;这一个条件发现,i 的值变成了零?也就是说 i 的值在这一步程序内的值被改变,从新赋予 0 的值,这便是出现死循环的原因吧。
经过查阅资料等等,我发现。其实一个数组并非只由其自己数组元素组成,这其中还包括这很多东西,比如说是数组名称 i 的存在,如果每个角标代表其元素的话,可以近似的称作arr[12]便是 i ,12便是 i 的角标。所以当访问到arr [12]时,给它赋值为 0 进而改变了 i 的值,所以出现了之前的死循环。这样说大概可以解释的清。
这个问题出现的原因就是因为越界访问!