自身对C语言数组越界访问的简易理解

先看一个程序

#include

int main()

{

int arr [ 10 ] = { 0 } ;

int i = 0 ;

for ( i = 0 ; i < 13 ; i ++ )

{

arr [ i ] = 0 ;

printf ( " hehe\n" ) ;

}

return 0 ;

}

大家猜猜这个程序如果编译链接会出现什么结果?

自身对C语言数组越界访问的简易理解_第1张图片


如上图,便是此代码的运行结果,发现是个死循环。这是为什么呢?

这个究竟是什么原因造成的呢?我对程序逐步运行进行监视,并进行查找 i 的值的变化情况发现,当 i < 13 时,如下; 

当 i = 9时按道理来说数组内元素已经访问完全了,应该不会进行下去,但是却并不是这样的,

自身对C语言数组越界访问的简易理解_第2张图片

自身对C语言数组越界访问的简易理解_第3张图片

自身对C语言数组越界访问的简易理解_第4张图片



此时的 i 已经到达了10,甚至是12,也就是说这个时候arr[10]以及arr[12]还是有某些非数组元素的东西的,接着继续运行,令人惊讶的一幕出现了。

自身对C语言数组越界访问的简易理解_第5张图片


在 i ++进行到 12 时,经过 arr[12]=0;这一个条件发现,i 的值变成了零?也就是说 i 的值在这一步程序内的值被改变,从新赋予 0 的值,这便是出现死循环的原因吧。

经过查阅资料等等,我发现。其实一个数组并非只由其自己数组元素组成,这其中还包括这很多东西,比如说是数组名称  i 的存在,如果每个角标代表其元素的话,可以近似的称作arr[12]便是 i ,12便是 i 的角标。所以当访问到arr [12]时,给它赋值为 0 进而改变了 i 的值,所以出现了之前的死循环。这样说大概可以解释的清。

自身对C语言数组越界访问的简易理解_第6张图片


这个问题出现的原因就是因为越界访问!

你可能感兴趣的:(c语言)