一道经典面试题讲解 :数组越界而没报错 ,却出现死循环 ?(C语言)
Posted 小轩在不在哟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道经典面试题讲解 :数组越界而没报错 ,却出现死循环 ?(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 之间放一个元素。
如果觉得文章对自己有帮助,欢迎大家多多点赞评论收藏,这对博主来说是很大的鼓励 !!
以上是关于一道经典面试题讲解 :数组越界而没报错 ,却出现死循环 ?(C语言)的主要内容,如果未能解决你的问题,请参考以下文章
习题讲解 | Google, Facebook高频面试题动态规划(DP)
每天一道面试题--删除排序数组中的重复项(python实现)