在 Visual Studio 的调试过程中,有时候我们可能需要对程序的运行内存进行查看,修改该怎么办?Visual Studio 也为我们提供了很好的解决方案。那就是使用 Visual Studio 自带的内存查看窗口。
首先我们通过内存窗口查看变量的值,我们启动 Visual Studio,创建一个工程,输入如下代码:
#include <stdio.h>
int main()
{
int testNumber = 5678;
printf("testNumber 的内存地址为 0x00%x \n", &testNumber);
//输出内存地址
//TODO:在这里插入断点
return 0;
}
我们在第七行设置好断点,然后按 F5 启动调试,等待触发断点。触发断点后,我们发现,IDE中并没有显示内存窗口(默认设置下),这时,我们点击菜单 -> 调试(D) -> 窗口 (W) -> 内存 (M) -> 内存1(1),就可以调出内存窗口了,如图:
我们看到,内存窗口里面显示着一大堆乱七八糟的数据,这里面的这些就是我们内存中的数据啦,我们可以通过变量 testNumber 的内存地址跳转到器对应的内存空间,我们看到 testNumber 的地址为 0x0018f830 (在不同的进程是不一样的),我们把这个地址输入到我们的内存窗口的地址栏。如图:
我们看到,尽管我们已经输入了正确地地址,但是我们还是没有看到正确的数据显示,其实原因非常简单,我们来回顾一下 C 语言的一些入门知识:我们知道,在我们的源代码中,我们的 testNumber 变量被定义为 int 整形,我们再想想 int 整形在内存中占几个字节?没错,是4个字节。所以我们应该以四字节的形式格式化这些内存数据,这是我们在内存窗口中单击我们的鼠标右键,在弹出的菜单中选择“4字节整数(4)”,然后就能正确地显示相关的数据了,如图:
没错,查看内存就是这么的简单。接下来我们就来查看与修改浮点数的内存数据,我们看下面这段代码:
#include <stdio.h>
int main()
{
double pi = 3.141592653589;
printf("pi 的内存地址为 %x \n", &pi);
//输出内存地址
//TODO:在这里插入断点
return 0;
}
同样的,我们在第7行设置断点,按F5启动调试,等待断点被触发:
这时我们看到的内存地址是这样的,与我们在内存窗口看到的不同,我们需要将其补齐,在我们现阶段编写的小程序中,显示的内存地址基本上都是六位的,我们在前面加上 “0x00”,将其补到八位(内存窗口上的地址栏里有几位就补到几位)。然后我们将其输入到内存窗口上的地址栏。
我们发现,现在显示的数据依然是错误的,因为查看器现在还是在使用我们之前设置的 4位整形格式 格式化我们的内存数据呢,我们知道,我们的 double 属于64位浮点数,所以我们在查看窗口点击鼠标右键,在弹出的菜单中选择“64位浮点(6)”,然后我们就能看到它正确地输出数据了。
我们注意到,在我们设置的变量pi的值的基础上,内存窗口里显示的数据多了几个0,这些0所代表的就是 double 型数据的最高精度。接下来我们尝试在内存窗口修改变量 pi 的值,为其补齐精度。现在我们用鼠标右键点击我们的pi的内存数据,在弹出的菜单中选择编辑值(E),在显示的输入框中我们输入 3.1415926535897931,按回车即可保存。我们看看效果:
怎么样,内存的查看与修改是不是很简单呢?其实我们只要记住下面的几个对应关系,常用的数值数据类型的内存查看与修改都不在话下:
类型名 | 变量类型 | 内存查看窗口中应选择的数据格式 |
---|---|---|
short | 16 位整形 | 2 字节整数 |
int | 32 位整形 | 4 字节整数 |
long | 32 位整形 | 4 字节整数 |
long long | 64 位整形 | 8 字节整数 |
float | 32 位(4字节)单精度浮点数 | 32 位浮点 |
double | 64 位(8字节)双精度浮点数 | 64 位浮点 |
内存新手常用的内存窗口操作就到这里了,其实关于内存操作还有很多高级用法,不过那不在我们初级调试教程的范围之内。我们在修改内存的时候要注意安全,防止随意修改导致的程序崩溃,甚至是无法结束进程!