目录
面试题
请问以下程序运行的结果是什么?为什么?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
这是我的在不同环境在运行的结果
首先是在vs2017上的运行结果
首先编译器检查到了这个错误,并且弹出了错误信息
这是我使用微信的拍照翻译工具对这句话进行的解读 运行检查失败 #- 变量’arr ’ r 周围的堆栈被损坏
接下来说说在vc++2010环境的运行结果
vc++2010的运行结果很明显不同于vs2017的是居然陷入了死循环!!!
接下来我们要对此进行一个分析,是什么原因?
首先我们知道栈的使用习惯是:1、先使用高地址空间,再使用低地址空间 而数组的使用习惯是:1、随着下标的增长,地址是由低到高变化的!
那么这两个结论对于我们的研究有什么关系吗?
答案是有的
在调试窗口上添加监视观察的是随着循环的不断遍历居然会影响到arr[10],arr[11],arr[12]的值,并且都被置零了,这就很不可思意当然这是在vs2017上的调试测试
大致的把内存图展示给大家
其实他的原理是
因为都是局部变量而局部变量是存放在栈上的,当数组的地址空间是由低到高,当数组的下标不断的增加,直到到达了arr[12]的时候,在这个地址位置上不仅仅表示的是arr[12]这个元素的地址,他还表示变量i的地址
而当arr[12] = 0指令的执行,伴随着i的值也会被改变 为0,那么0 < 12循环永远不会终止
原因是因为arr[9]和arr[12]之间空了两个整形,恰好这个原因导致他们之间产生了关联关系
1. 另外注意:1、vc++2010上是空两个整形
2、linux上是空一个整形
3、在vs2017上能被直接检查出来