如何'潜水'一个int *,它指向一个动态分配的整数数组并将其表示为一个固定的int []数组?换句话说,如果我潜入一个int *它显示地址和int指向,但我希望看到所有整数的数组。
答案 0 :(得分:8)
我在这个问题上注意到了TotalView标签。您是否在询问如何在totalview中查看数组中的值?如果是这样,那么答案很简单。
假设您有一个指针p,其类型为int *,并且您当前指向具有10个整数的数组。
步骤1.潜入指针。这是通过双击鼠标,单击鼠标中键或使用上下文菜单中的潜水选项完成的 - 所有这些都是将鼠标光标放在源代码窗格或堆栈框架窗格中的变量之后。
这会打开一个新窗口,说明
表达式:p 地址:0xbfaa1234 输入:int *
并在数据区域中显示类似
的内容0x08059199 - > 0x000001a5(412)
此窗口显示指针本身,列出的地址是指针的地址。值(上例中的0x08059199)是指针所具有的实际值。箭头右侧的所有内容都只是一个“提示”,告诉您希望它指向。
步骤2.再次潜入指针。重复双击或鼠标中键,这次是变量窗口中的数据值。 (所以你双击它所在的位置0x08059199)。
这将有效地“取消引用”指针。现在窗口不是关注指针本身而是指针指向的东西。请注意,地址框现在包含0x08059199,这是之前的值。
表达式:*(((int *)p)) 地址:0x08059199 键入:int
并在数据区域中显示类似
的内容0x000001a5(412)
步骤3.将数据窗口转换为所需的类型。只需单击类型字段并将其更改为int [10]。然后点击返回。
这告诉调试器0x08059199是10个整数数组的开头。
窗口将生成两个新字段:Slice和Filter。你现在可以将它们单独留下,但它们可以在以后使用。
数据区现在将显示两列“字段”和“值”以及10行。
字段列将是数组[0] - [9]中的索引,值列将告诉您每个数组位置中的数据。
其他提示:
在更复杂的数据结构中,您可能想要深入研究单个元素(也可能是指针,潜水也会取消引用它们)
您总是可以投射到不同的类型或长度来查看数据“就好像是”
您可以通过单击值列并编辑您在那里找到的内容来编辑实际数据值。当您想要从应用程序中激发特定的错误行为时,这非常有用
您始终可以使用“<”撤消潜水作业变量窗口右上角的图标。
您可能会在
找到一些有用的在线视频http://www.roguewave.com/products/totalview/resources/videos.aspx
特别是有一个标有“TotalView入门”的文章。
请随时联系Rogue Wave Software获取TotalView使用技巧! roguewave dot com的支持是一个很好的解决方案。
Chris Gottbrath (Chris dot Gottbrath在roguewave dot com) Rogue Wave Software的TotalView产品经理
答案 1 :(得分:0)
这不是很难,但我忘了它究竟是如何运作的。我找到了一个解释它的页面;)。我想用点和数组来调用例如test你应该使用& test来获得它。 只需查看此页面:
答案 2 :(得分:0)
如果不确切知道数组中有多少个整数,那么你无法做到这一点。
答案 3 :(得分:-2)
如果你有一个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]);
}
因此,要回答您的问题,您已经可以将指向有效动态分配数据的指针视为数组。您必须记住分配数据的大小,当然也需要在常规数组中进行。