#include <stdio.h>
int main()
{
int i = 0;
int arr[] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hello\n");
}
return 0;
}
阅读上面这个代码,我们会认为这不就是简单的数组访问越界么。那么这段代码就应该会报错,接下来我用VS进行运行,看结果真是这样吗?
VS 32位
VS 64位
由上面可知,这段代码在VS上不同位操作系统的结果是不一样的,并不都会报错。原因是这与地址在内存中是如何开辟的有关。
32位内存开辟是由高地址向低地址的,由于 int i = 0 先于 数组arr 创建,故变量i的地址是高于数组arr的地址的。又由于一个数组其内部又是从低地址到高地址存储的。故数组内越往后存储,其地址就越高。此代码的a[12]恰巧指向i的地址,使i又被变为0,因此一直死循环。
64位内存开辟都是低地址向高地址的,所以会发生数组越界。
下面是VS中调试查看内存的步骤,能熟练调试,对于一些代码问题是非常有帮助的。因此代码遇到问题不要慌,先调试看看。