#include<stdio.h>
int main()
{
	int i = 8;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d", arr[12]);
	return 0;
}

Java 数组越界的判断 数组越界如何定位_数组

目录

 一、为什么数组在越界访问时,会访问到i变量的空间?

 二 、为什么越界访问编译器不会报错呢?

 一、为什么数组在越界访问时,会访问到i变量的空间?

第一点:局部数据是存放在栈区的,而栈区的内存的使用规则是从高地址的内存空间开始分配,由高到低进行分配内存空间。

第二点:我们在这道题创建的变量i和整型数组都是局部的,因为都是在大括号里面创建的,所以会分配栈区的内存,将他们的数据放在栈区,所以编译器会首先分配给i变量高地址的空间,给数组分配的空间在i变量空间的下面。

第三点:数组的下标的变化是随着地址的增长,下标由低到高变化的,所以数组在越界访问时,就会有可能访问到i变量的空间。

画图解释:

Java 数组越界的判断 数组越界如何定位_Java 数组越界的判断_02

注意:每个编译器分配内存的方式不同,在vs2019中,我们根据这道题创建的i变量和arr数组所占的空间相差2个整型字节大小的空间,但在其他编译器中,可能就不是2个字节大小的空间。

这次的数组访问就是巧合,是C语言的一个陷阱,在《C陷阱和缺陷》这本书中有讲到。

可以想象到,数组的越界访问其实就是闯到了别人的家里面,而这一次的越界访问,访问到的是自己亲戚家,但终究不是自己的家。

 二 、为什么越界访问编译器不会报错呢?

编译器不会报出你写的所有错误,如果他会报出所有错误,还要程序员干什么呢?

可以将编译器比喻成警察,程序里的错误比喻成小偷,警察是不可能抓住所有的小偷的,这是不现实的。