关于c ++:如何在Visual Studio调试器中显示动态分配的数组?

How to display a dynamically allocated array in the Visual Studio debugger?

如果您有一个静态分配的数组,Visual Studio调试器可以轻松显示所有数组元素。 但是,如果您有一个动态分配并由指针指向的数组,那么当您单击+以展开它时,它将仅显示该数组的第一个元素。 是否有一种简单的方法来告诉调试器,将这些数据显示为Foo类型和X大小的数组?


是的,简单。
说你有

1
char *a = new char[10];

在调试器中写入:

1
a,10

会向你显示内容,就好像它是一个数组。


有两种方法可以查看数组m4x4中的数据:

1
2
3
4
5
6
float m4x4[16]={
    1.f,0.f,0.f,0.f,
    0.f,2.f,0.f,0.f,
    0.f,0.f,3.f,0.f,
    0.f,0.f,0.f,4.f
};

一种方法是使用Watch窗口(Debug / Windows / Watch)。添加watch =

1
m4x4,16

这会在列表中显示数据:

enter image description here

另一种方法是使用Memory窗口(Debug / Windows / Memory)。指定内存起始地址=

1
m4x4

这会在表格中显示数据,这对于二维和三维矩阵更好:

enter image description here

右键单击"内存"窗口以确定二进制数据的可视化方式。选择仅限于整数,浮点数和一些文本编码。


在监视窗口中,在数组名称和要显示的项目数量之后添加逗号。


再访:

我们假设你有一个指针:

1
double ** a; // assume 5*10

那么你可以在下面的Visual Studio调试手表中写下:

1
(double(*)[10]) a[0],5

将它转换成如下所示的数组,您可以一次查看所有内容。

1
double[5][10] a;

对于,

1
int **a; //row x col

加上这个观看

1
(int(**)[col])a,row

另一种方法是在MSDN中指定。

简而言之,您可以将字符数组显示为几种类型的字符串。如果你有一个数组声明为:

1
char *a = new char[10];

您可以在监视窗口中将其打印为unicode字符串,其中包含以下内容:

1
a,su

有关所有可能的转换,请参阅MSDN页面上的表格,因为有很多不同的转换。许多不同的字符串变体,用于打印数组中各个项目的变体等。


您可以在文档中的此gem中的监视窗口中找到可以使用变量执行的许多操作的列表:
https://msdn.microsoft.com/en-us/library/75w45ekt.aspx

对于变量a,有其他答案中已经提到过的东西,比如

1
2
a,10
a,su

但是格式和大小还有很多其他说明符,例如:

1
2
a,en (shows an enum value by name instead of the number)
a,mb (to show 1 line of 'memory' view right there in the watch window)

对于MFC阵列(CArray,CStringArray,...)
按照提示#4中的下一个链接

http://www.codeproject.com/Articles/469416/10-More-Visual-Studio-Debugging-Tips-for-Native-De

例如,对于"CArray pArray",请在Watch窗口中添加

1
     pArray.m_pData,5

看前5个元素。

如果pArray是二维CArray,您可以使用下一个语法查看第二维的任何元素:

1
     pArray.m_pData[x].m_pData,y

我还没有找到一种方法来使用多维数组。但您至少可以(如果您知道所需条目的索引)将监视添加到特定值。只需使用索引运算符即可。

对于名为current的数组,其内部有一个名为Attribs的数组,其中有一个名为Attrib的数组,如果您想要位于第26位,它应该如下所示:

1
((*((*current).Attribs)).Attrib)[26]

您也可以使用偏移量

1
((*((*current).Attribs)).Attrib)+25

将显示ne"next"25个元素。
(我使用的是VS2008,最多只显示25个元素)。


推荐阅读

    linux满屏显示命令?

    linux满屏显示命令?,工具,系统,服务,电脑,网络,技术,信息,数据,上会,软件,如

    显示linux时间命令?

    显示linux时间命令?,时间,系统,信息,一致,命令,文件,终端,目录,选项,参数,lin

    linux命令刷新显示?

    linux命令刷新显示?,系统,工作,最新,地址,命令,异常,分析,工具,信息,软件,Lin

    linux显示最多的命令?

    linux显示最多的命令?,系统,情况,信息,数据,工具,电脑,状态,时间,分析,命令,

    linux显示隐藏命令?

    linux显示隐藏命令?,系统,电脑,档案,工具,一致,生产,文件夹,文件,命令,开头,l

    linux显示错误命令?

    linux显示错误命令?,信息,系统,电脑,状态,时间,环境,命令,搜狐,密码,异常,虚

    linux逐行显示命令?

    linux逐行显示命令?,标准,信息,系统,工作,地址,命令,实时,名称,文件,目录,Lin

    linux显示时间命令?

    linux显示时间命令?,时间,系统,管理,标准,信息,单位,工具,数据,中国,命令,lin

    linux启动显示命令行?

    linux启动显示命令行?,系统,密码,终端,状态,首页,情况,基础,电脑,信息,工具,l

    linux启动显示命令行?

    linux启动显示命令行?,系统,密码,终端,状态,首页,情况,基础,电脑,信息,工具,l

    linux显示之前的命令?

    linux显示之前的命令?,系统,信息,命令,地址,服务,环境,数据,标准,数字,不了,l

    linux打开显示器命令?

    linux打开显示器命令?,信息,工具,系统,环境,发行,实时,数据,设备,命令,文件,L

    linux命令实时显示?

    linux命令实时显示?,系统,实时,时间,信息,情况,命令,对比,电脑,名称,一致,lin

    linux外部命令显示?

    linux外部命令显示?,系统,工具,命令,一致,盘中,软件,技术,外部,内部,文件夹,L

    linux命令显示ip?

    linux命令显示ip?,地址,系统,网络,信息,技术,电脑,手机,设备,服务,管理,配置L

    linux命令行调试代码?

    linux命令行调试代码?,环境,代码,信息,平台,程序,编辑,版本,步骤,体系结构,

    linux下单步调试命令?

    linux下单步调试命令?,信息,系统,代码,工程,地址,工具,工作,数据,管理,环境,l

    linux串口调试命令?

    linux串口调试命令?,设备,数据,信息,数字,系统,标准,通讯,软件,通用,状态,lin

    linux编译时显示命令?

    linux编译时显示命令?,系统,基础,工具,代码,百度,下来,网上,命令,内核,文件,L

    linux显示运行命令?

    linux显示运行命令?,系统,服务,状态,信息,工具,数据,电脑,标准,管理,时间,如