一道经典面试题讲解 :数组越界而没报错 ,却出现死循环 ?(C语言)

下面这道经典易错题出自《C陷阱与缺陷》,也一度被众多互联网公司作为面试题拿来考察,可见其易错程度与重点程度,下面我就给大家详细讲解一下这道列题,希望对大家有所帮助:

作为面试题:

下面我们就以简洁代码形式给出,原理是一样的,话不多说,上代码:

 

#include <stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	//0~9

	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hehe\n");
	}

	return 0;
}

按常理来说,这个数组只有10个元素,也只能打印10个“hehe”,这里却是循环13次,应该出现数组越界导致的程序奔溃,如图:

 然而这里却出现了无限死循环:

 这到底是为什么呢,下面就跟着我一起来调试(很重要)分析:

1.如图,当i=11时,arr[11]=0(先不考虑越界),这里注意arr[12]的值始终是和i的值是一样的,都还是正常的,再下一步 ->

 2. 当arr[12]的值被制为0时,i 的值也同时被制成0,接下来导致出现啦死循环打印。

猜想: 到这一步不难猜到,arr[12]的地址和i 的地址应该是一模一样的,只有这样才会导致出现i的值变化始终和arr[12]的值变化是同步的。

下面我们来验证猜想:(在监视窗口中取出两个变量的地址)

 果然,arr[12]和 i 的地址是一模一样的,所以才会出现同步变化以及死循环。 是为什么呢?

下面我们就来给出答案:

1.首先我们要知道,局部变量(i 和 arr)在内存中是放在栈区的。

栈区的使用习惯是: 先使用高地址空间,再使用低地址空间 (i在定义在前,arr定义在后)

2. 数组元素的地址是:随着下标的增长是由低到高变化的

这里博主画了一幅图帮助大家理解(画的太丑了勿喷hhh):

 所以由于栈区存放中 arr[12] 和 i 的地址相同 ,当 arr[12]被制成 0 时 i 也被制成 0 ,从而导致死循环打印的出现。 至此,题目讲解完毕。

补充 :

 由于编译器的差异这里相隔地址也会有所差异,并不是绝对的,下面我就给出几个常见的差异,大家可以选择性记忆:

1.在 vc6.0 和 vs2017 中  arr和 i 是 紧挨着放的。

2. vs 2013-2019 (除去2017) arr 和 i 中间有2个元素,列如此题。

3. gcc 中 arr和 i 之间放一个元素。

 

如果觉得文章对自己有帮助,欢迎大家多多点赞评论收藏,这对博主来说是很大的鼓励 !!

  • 48
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值