history idea npm安装 facebook dll reference bitmap tree insert ios4 air 后台ui模板 后台管理系统模板 ppt视频教程下载 jquery的each遍历方法 change事件 大数据项目开发案例 java反射方法 增删改查sql语句 ab软启动器 json转object docker保存镜像 mysql数据库 python基本语法 python变量定义 python写入txt文件 javapackage java类 java编程学习 java中tostring方法 java定义变量 java配置jdk linuxsleep 方正流行体 找茬辅助 python封装 无限视距 一键隐藏 苹果手机验机软件 梦想世界答题器
当前位置: 首页 > 学习教程  > 编程语言

一道调试不出来的题目bug

2021/1/28 23:29:28 文章标签:

首先我们就来先看看这道题目是什么 试分析出下列代码的运行结果&#xff0c;并说明为什么会出现这种结果&#xff1f; #include <stdio.h>int main() {int i 0;int a[3];for (i 0; i < 5; i){a[i] 0;printf("%d\n", i);}return 0; }真个代码看起来就有…

首先我们就来先看看这道题目是什么

试分析出下列代码的运行结果,并说明为什么会出现这种结果?

#include <stdio.h>

int main()
{
 
	int  i = 0;
	int a[3];

	for (i = 0; i <= 5; i++)
	{
		a[i] = 0;
		printf("%d\n", i);
	}

	return 0;
}

真个代码看起来就有些问题,但是又不知道有什么问题???

那我们先看看他的运行结果是什么吧!

在这里插入图片描述
0 1 2 3 4 开始死循环了,这是为啥呢???感觉像是数组越界呀,问啥不报错呢?

如果要深究,那就有的说头了,先画张图感受一下吧。

在这里插入图片描述

大家都知道,我们的局部变量都是存储在栈区空间里的,而栈区中内存使用是先使用高地址

空间,在使用低地址空间,因为int i 是在int a数组之前创建的,所以 i 变量是高地址,

数组a是在低地址。而数组存储是随着数组下标的增加,地址从高到低,所以数组从上到下依

次是 a[2] a[1] a[0],

接下来就是关键了,进入for 循环,i变量依次增加到3,a[2] a[1] a[0],的数据也都清零,屏幕

也打印出0 1 2 到 下一次循环,i++后,a[4] = 0,这时其实已经非法访问数组以外的内容了,但是任然可以置零,等到 i 变量变成5时,
在这里插入图片描述

在这里插入图片描述
变量 i 也变成0了,导致 i 又从0开始循环了,这就是问题所在,

在这里插入图片描述

其实你打开a[5]发现a[5] = 3,其实a[5] 就是i a数组因为在高地址上,所以恰好数组非法访问

到i 了,导致i变量被置零,这就是问题的原因。

所以这题考得就是你对栈区变量存储的位置清不清楚(从高地址到低地址存放),另外数组在

栈区存放是岁下表的增加,存放到高地址,其实在不同的编译环境下,变量的存储位置会有

不同,但是只要越界到一定位置都会出现这种情况(访问到高地址的数据)。

所以我们又尽量避免数组的越界访问呀。。。。


本文链接: http://www.dtmao.cc/news_show_650223.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?