在此线程之后,我想分享一个相关问题:如何在 totalview 中将 int ** 作为 2D 数组进行潜水?(这里讨论了解决方案)。如果有人遇到同样的问题,我希望这会有所帮助!
假设在我的代码中我有一个动态二维数组设置如下
int ** array2D = new int * [5];
for (int i = 0; i < 5; i++) {
array2D[i] = new int [5];
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
array2D[i][j] = i + j;
}
}
现在,在 TotalView 中,当您从 Stack Frame 跳入 array2D 时,变量窗口应该会弹出并显示如下内容:
Expresion: array2D, Address: 0x7fffd50efbc8
Type: int **
Value: 0x02234660 -> 0x02234690 -> 0x00000000 (0)
以下步骤类似于我在上面提到的线程中提到的 Chris Gottbrath ,但在我们应该何时以及如何准确地转换 Type 方面它变得有点复杂。所以,
第 1 步:通过鼠标中键单击或双击该值,深入指针的值以取消引用指针。
这样做应该会给你这样的东西:
Expresion: *(((int **)array2D)), Address: 0x02234660
Type: int *
Value: 0x02234690 -> 0x00000000 (0)
第 2 步:现在将类型转换为一级。在“类型”通道中,将 int * 更改为
int *[5]
然后点击进入。这样,调试器就知道 array2D 是指向大小为 5 的指针列表的指针。请注意,我的动态数组是指向指针列表的指针。现在,上面显示的值将变为如下所示:
Field Value
[0] 0x02234690 -> 0x00000000 (0)
[1] 0x022346b0 -> 0x00000001 (1)
[2] 0x022346d0 -> 0x00000002 (2)
[3] 0x022346f0 -> 0x00000003 (3)
[4] 0x02234710 -> 0x00000004 (4)
我们现在看到 array2D 有 5 个元素,它们是指向子列表的指针。现在,如果我们深入研究这些元素中的任何一个,我们还不会得到整数列表。要查看整数,我们需要再次取消引用,对于我们进入的每次潜水。
第 3 步:假设我们要深入元素 [2] 以检查从 array2D[2][0] 到 array2D[0][4] 的整数。当我们在面板中单击该行时,我们会看到:
Expresion: (((int *[5])*(((int **)array2D))))[2], Address: 0x02234670
Type: int *
Value: 0x022346d0 -> 0x00000002 (2)
我们现在正在查看指向子列表编号 2 的指针,该子列表应该包含整数。
第 4 步:现在,再次深入了解取消引用,我们应该看到如下内容:
Expresion: *(((int *)(((int *[5])*(((int **)array2D))))[2])), Address: 0x022346d0
Type: int
Value: 0x00000002 (2)
步骤 5:现在在第二级中投射类型。在“类型”频道中,将 int 更改为
int [5]
然后点击进入。我们开始了:我们看到元素 array2D[2][0] - array2D[2][4]
Field Value
[0] 0x00000002 (2)
[1] 0x00000003 (3)
[2] 0x00000004 (4)
[3] 0x00000005 (5)
[4] 0x00000006 (6)
虽然潜水一维阵列很简单,但二维阵列潜水似乎需要仔细的潜水和施法顺序。我尝试了其他方法,但它们无法正常工作。所以,我希望这对偶然发现同样问题的人有用。