1.程序代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
int main()
{
int i = 0;
int arr[10] = {0};
for (i = 0; i <= 12; i++)
{
printf("****\n");
arr[i] = 0;
}
system("pause");
return 0;
}
2.执行结果
在VS编译系统中,按理说应该是编译错误,但是结果为死循环,因为i与arr为局部变量,所以存放在栈区中,栈区中的规则为:先使用高地址再使用低地址(栈区:局部变量;堆区:动态内存分配;静态区:静态变量)代码中为先声明i,再声明arr,所以i再高地址,arr在其前面的地址,arr中的元素按照低到高使用地址,在VS编译器中,两个参数的地址之间空两个位置,(在Linux中空出一个位置,在VC++6.0中不空位置)因此,如下图所示:
因此arr[12]与i的地址相同,所以在循环中的arr[i]=0把arr[12]赋值为0,因为arr[12]与i的地址相同,所以i也变成了0,循环就会一直不停的走下去
在Linux操作系统中,与此同理,不过编译此程序会出现错误,把条件i<=12改成i<=11就会出现死循环,因为在此操作系统中,每两个参数之间的地址只空一个位置
在VC++6.0中,只要超出范围了,就会编译出错,因为此操作系统中,两个参数之间的地址没有空出位置
VS与VC++6.0中空出位置是为了方便程序员发现代码中的问题