关于数组越界

定义一个数组是方法好几种
不管如何定义,在使用数组时都不能使用超出数组长度的元素,例如定义一个a[10],数组元素是0~9,使用时可以小于9,但是不能超过九,例如使用a[10]就是发生数组越界
数组越界问题乱七八糟,没法总结,所以一定不可如此使用,下边举个例子,并附上详细说明

int i;
	int arr[10];
	for(i=0;i<=10;i++)
	{
		if(i == 10)
		{
			i += 2;
		}
		arr[i] = 0;
		printf("%d\n",i);
	}

这段代码里,先定义了一个长度10的一维数组,但在for循环中,对arr[10]进行了操作,看代码本身可能不好发现错误,运行后,程序出现死循环。循环中的if分支语句接下来讲解。
再之前的一些版本的编译器中(这里我还没大概统计,所以只作说明),保存所定义的变量是先定义先保存,基于保存方式是用栈保存,也就是先定义的就先入栈,先进后出,位于底下,而定义数组则是,数组下标大的,储存在高位地址(高地址在下)也就是arr[0]在上,arr[9]在下靠近i变量,旧版本编译器中,变量时连续存储的,i上边紧接着就是arr[9],在for循环语句中,做出给arr[i]赋值为0的操作,当你对数组进行越界操作时,系统不知道发生越界,他会默认arr[9]下边就是arr[10],所以将i重新赋值为0,此时i=0,进入for循环判断还不能结束循环所以成了死循环。这里讲解的时候是在旧版本编译器中要删除代码中if语句会发生死循环
而在实际操作中,代码很多的时候你并不知道arr[9]下边是什么变量,因为越界而篡改了一个变量的值,所以发生的错误是没办法预料,莫名其妙的。
在新一些的编译器中,有对越界做出有效预防的情况,旧版编译器中变量连续存储,新版中每个变量之间会有两个单位的间隔,就把这两个间隔当作炸弹,当越界篡改炸弹的值的时候,系统就会报错,提示发生越界,所以这段代码放在新一些的编译器中,有这条if语句跳过这两个炸弹,依旧会发生死循环,总而言之,数组越界很可能是个看不出眉目,很难想到会发生什么错误,而当在不明情况时出现数组越界的错误,程序跑完报的错误完全想不到时因为数组越界,所以一定要避免这类错误发生。
感觉这个错误,好生怪胎。先到这里咯~~😀

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值