经典面试题陷阱之无限循环

时间:2022-07-16 20:29:05

在vs环境下,请看下面的代码输出的结果是什么?
#include<stdio.h>

int main()
{
	int i = 0;
	int arr[10] = { 1,1,1,1,1,1,1,1,1,1 };
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hehe\n");
	}
	return 0;
}

大家一看到这道题肯定会以为越界访问了,程序会挂掉。但是这道题里确实是有一点陷阱的,我们运行起来,这个程序输出的结果尽然是无限循环的hehe。下面让我们一起来探究一下:

★首先,我们来看一个现象:
#include<stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;

	return 0;
}

然后,我们调试起来,看一下他们的内存:
经典面试题陷阱之无限循环

我们可以观察到栈区的局部变量在内存中是先定义的在高地址,后定义的在低地址。然后我们回来这道题里,i的地址肯定比数组arr的地址高,然后数组又是在内存中从低地址到高地址连续连续存放的,看下面的图就很容易理解了。
经典面试题陷阱之无限循环

我们对上边的那道题进行调试,看一下:
经典面试题陷阱之无限循环

调试到这里我们是不是发现了什么?没错,arr[12]的地址和i的地址竟然是一样的,也就是说arr[12]就是i,那么我们把arr[12]赋值为0的时候,是不是以为这把i改变成0呢!没错,就是这样的。当然,事实上这道题是碰巧这样的,因为arr[9]低地址和i的高地址真好差了两个,但是在linux系统下和VC 6.0++中却不是这样,所以在一开始就声明了编译器。感兴趣的朋友可以下去再不同的编译器测试一下。

完整代码请移步——> 面试陷阱