数组越界的问题

#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;
}

目录

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

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

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

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

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

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

画图解释:

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

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

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

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

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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值