您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
024第六章 数组02
发布时间:2021-04-19 15:04:14编辑:雪饮阅读()
单步调试 step into/step out/step over 区别
step into:单步执行,遇到子函数就进入并且继续单步执行(简而言之,进入子函数);
step over:在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。有一点,经过我们简单的调试,在不存在子函数的情况下是和step into效果一样的(简而言之,越过子函数,但子函数会执行)。
step out:当单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数。
了解了单步调试的这几个功能之后,那么我们一个简单的程序如:
我们立用这个step over来调试,在调试界面右半部分,我们可以输入一个简单的表达式,据说这家伙某些复杂的表达式不支持,好像只支持单变量的,那么我们现在这边调试到了i为1的时候,我们可以直接在右边区域的最左列第一行中输入比如这里我要看a[6]的值,虽然i还没有到6,但是我就是要看,可以看到,它是有一个默认值的,即便还没有赋值到
这里step over可以用f10快捷键,如果没有键冲突的话。
那么之前曾经讲过,可以通过鼠标定位来设置断点,那么其实也可以选择一个位置,然后点击这个小手形状来插入一个新的断点
也可以直接在光标闪烁的时候点击小手
那么此时就是在光标闪烁所在行添加一个断点,不过有时候会在光标下面行打一个断点,我认为这应该就和语法报错一样,对于行的定位是有一定的误差的
其实上面选择一个段来打断点,其实是多余的,只是为了好表达,准确的来说应该就是按光标闪烁所在行进行打断点的。
当数组中已经被初始化的元素比较多的时候(猜测应该是多于1个的时候)这个调试面板中数组名的变量就可以点击其让你展开,展开后鼠标左键勾选Hexadecima Display就可以以16进制显示数组的每个元素了,实际上显示的是数组的每个元素的地址,其地址就是16进制的。
那么可以观察发现其默认没有赋值的地址都是0xcccccccc,已经赋值了的地址都是以连续的内存单元存储的
对于上面向调试中的右边面板中添加表达式,也就是添加监视,也可以通过这里来添加
那么如何查看内存呢?就是查看地址表咯,因为变量这些东西最后都是存储在内存的,地址都是16进制的。
查看步骤如下:查看=》调试窗口=》memory
然后你输入一个16进制的地址,然后回车即可快速定位的这个地址处
那么我们来看一个数组在内存中的存储情况
然后我们将这个地址框缩小点
可以发现内存中对于刚才我们的1-9存储是反向存储的。这个就涉及到汇编了,这里暂时不会继续深入下去。
那么这里以a[9]举例,它的地址就是0x0019FF28,可以看下面这个图,上面那个图中看似在0x0019FF27上,实际上因为0x0019FF27的后面的第一个字节的第一个位上面是00,所以从0x0019FF27后面的00后面的09才是0x0019FF28
如果还是觉得没有弄懂,可以在程序中用%p输出某个元素指针的引用地址,并用&获取指针如:
#include <stdio.h>
void main()
{
int i,a[10];
for(i=0;i<=9;i++)
{
a[i]=i;
}
for(i=9;i>=0;i--)
{
printf("%d,%p\n",a[i],&a[i]);
}
}
关键字词:c,数组,调试