我如何“潜水”一个 int *,它指向一个动态分配的整数数组并将其表示为一个固定的 int[] 数组?换句话说,如果我使用 int * 它会显示地址和指向的 int,但我希望看到所有整数的数组。
4 回答
我注意到这个问题上的 TotalView 标签。您是在问如何在 totalview 中查看数组中的值吗?如果是这样,那么答案很简单。
假设您有一个类型为 int * 的指针 p 并且您当前指向一个包含 10 个整数的数组。
步骤 1. 在指针上潜水。这是通过双击、单击鼠标中键或使用上下文菜单上的潜水选项来完成的——所有这些都是在将鼠标光标放在源代码窗格或堆栈框架窗格中的变量上之后。
这将打开一个新窗口,上面会说
表达式:p 地址:0xbfaa1234 类型:int *
并且在数据区域中会说类似
0x08059199 -> 0x000001a5 (412)
此窗口显示指针本身,列出的地址是指针的地址。该值(上例中的 0x08059199)是指针的实际值。箭头右侧的所有内容都只是一个“提示”,告诉您希望它指向。
步骤 2. 再次在指针上潜水。重复双击或鼠标中键,这次是在变量窗口中的数据值上。(所以你双击它说0x08059199的地方)。
这将有效地“取消引用”指针。现在窗口的焦点不是指针本身,而是指针指向的东西。请注意,地址框现在包含 0x08059199,这是之前的值。
表达式:*(((int *) p)) 地址:0x08059199 类型:int
然后在数据区域中它会说类似
0x000001a5 (412)
步骤 3. 将数据窗口转换为您想要的类型。只需单击类型字段并将其更改为 int[10]。然后点击返回。
这告诉调试器 0x08059199 是 10 个整数数组的开头。
该窗口将增长两个新字段:切片和过滤器。您现在可以不理会这些,但它们以后会很有用。
数据区域现在将显示两列“字段”和“值”以及 10 行。
字段列将是数组 [0] - [9] 中的索引,而值列将告诉您每个数组位置中有哪些数据。
其他提示:
在更复杂的数据结构中,您可能想要深入研究单个元素(也可能是指针,潜水也会取消引用它们)
您始终可以转换为不同的类型或长度以“就好像它是”一样查看数据
您可以通过单击值列并编辑在那里找到的内容来编辑实际数据值。当您想从应用程序中引发特定的错误行为时,这很有用
您可以随时使用变量窗口右上角的“<”图标撤消潜水操作。
有一些在线视频可能对您有帮助
http://www.roguewave.com/products/totalview/resources/videos.aspx
特别是有一个标记为“TotalView 入门”。
请随时通过 Rogue Wave 软件与我们联系,获取 TotalView 使用提示!roguewave dot com 的支持是一个很好的解决方案。
Chris Gottbrath(roguewave dot com 的 Chris dot Gottbrath)Rogue Wave Software 的 TotalView 产品经理
这不是很难,但我忘记了它是如何工作的。我找到了一个解释它的页面;)。我认为使用 ints 指向和数组调用例如 test 你应该使用 &test 来获取它。只需查看此页面:
如果不确切知道数组中有多少个整数,您将无法有意义地执行此操作。
如果您有一个int *p
指向连续int
数据中的第一个元素的 ,无论是动态分配的还是静态数组,您都可以将它作为一个数组进行索引:
int *data = malloc(3 * sizeof *data);
int *p;
/* malloc error detection omitted for brevity */
data[0] = 1;
data[1] = 2;
data[3] = 42;
p = data;
assert(p[0] == 1);
assert(p[1] == 2);
assert(p[2] == 42);
您必须知道以这种方式访问的有效数据的大小。
所以,假设我data
有如上,并想写一个函数来打印它。像这样声明函数是不行的:
void print_array(int *data);
因为当您调用 时print_array(data);
,该函数不知道要打印的元素数量。
你可以定义你的print_array()
喜欢:
void print_array(int *data, size_t n);
其中表示调用者必须提供的n
由 指向的有效元素的数量。data
或者您可以决定每个“数组”都将以一个标记值结尾,该值仅在数据末尾使用,否则不是有用的值:
data[2] = 0; /* data[0] and data[1] are useful, valid values
and data[2] is 0 to signify the end of the data */
然后你可以声明你print_array()
的:
void print_array(int *data);
并继续data
在函数定义中进行索引,直到您遇到哨兵:
void print_array(int *data)
{
size_t i;
for (i=0; data[i] != 0; ++i)
printf("%d\n", data[i]);
}
因此,要回答您的问题,您已经可以将指向有效动态分配数据的指针视为数组。当然,您必须记住分配数据的大小,这也需要在常规数组中进行。