在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++中却不是这样,所以在一开始就声明了编译器。感兴趣的朋友可以下去再不同的编译器测试一下。