C语言中的数组越界

经常用C语言的都知道,C语言是不检查数组越界的问题的。

先看这样一段程序

int main() {
	int i;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++) {
		printf("哈哈\n");
		arr[i] = 0;
	}
	return 0;
}

请问输出结果是什么?

一眼看去虽然数组越界了但是程序还是能运行的,循环13次,应该输出13个“哈哈”。我一开始也是这样想的,但是在机器上一运行,惊了,是死循环,无限打印“哈哈”。

打开调试一步一步走,这里我直接将arr[10]、arr[11]、arr[12]都监视了,竟然发现i和arr[12]的变化是一致的。当i = 9时如下

当i=11时,发现arr[10]、arr[11]都置0了,再继续走

当i = 12 进入循环后,执行arr[i] = 0

i 和 arr[12]都变成0了。i = 0 后又能进入循环,估计再执行一遍的结果还是一样,这就是死循环。

一开始我们就知道i和arr[12]的变化是一致的,很容易想到地址,那么取地址

i和arr[12]的地址是一样的!!!

之后我把int i 和定义数组 int arr[] 的位置换了一下,先定义数组在定义 i,执行后有一个Debug Error,不知道为何会这样。

虽然不知道为什么是这样存储 i 的值的,但是以后写代码中要格外注意数组越界问题,最好用sizeof(arr)/sizeof(arr[0])来获取数组元素个数。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值