C 如何在调试模式下检查动态分配内存的值?

C 如何在调试模式下检查动态分配内存的值?,c,eclipse,netbeans,C,Eclipse,Netbeans,我正在使用eclipse和netbeans for c,我想检查在调试时在内存中动态分配的变量值(在eclipse和netbeans中) 出于某种原因,我只能看到指针本身的值,以及它的第一项 要说明:使用此代码: int foo[10]; int *bar = malloc(10*sizeof(int)); 我可以在以后(调试时)检查整个数组的值。 例如,我可以在watches窗口中检查foo[7]的值 但有了这个代码: int foo[10]; int *bar = malloc(10*

我正在使用eclipse和netbeans for c,我想检查在调试时在内存中动态分配的变量值(在eclipse和netbeans中)

出于某种原因,我只能看到指针本身的值,以及它的第一项

要说明:使用此代码:

int foo[10];
int *bar = malloc(10*sizeof(int));
我可以在以后(调试时)检查整个数组的值。 例如,我可以在watches窗口中检查foo[7]的值

但有了这个代码:

int foo[10];
int *bar = malloc(10*sizeof(int));
我只能检查
bar
指向的位置,以及
bar[0]
的值(但不能检查其他值)

如何查看数组的所有值


更新:这个问题在eclipse和netbeans中都得到了解决。 在eclipse中:在变量窗口中右键单击所需变量->选择显示为数组->填写开始索引和数组长度

在netbeans中:在“手表”窗口中,添加具有以下格式的新手表:

*((bar)+0)@10
其中
bar
应为指针名称,
0
应该是您的开始索引 而
10
应该是它的长度


请允许我添加一些个人信息:这是我在stackoverflow上的第一条消息。我希望您觉得它很有用。

我不知道它在Eclipse或Netbeans中是否有效,但您可以尝试在
*(bar+1)
上为第二个“条目”添加一个手表。但是,除非调试器允许您将其键入数组(如
(int[])bar
,否则您可能无法将
bar
用作数组,我不知道它是否能在real C中工作)。

因为您使用的是指针变量,调试工具可以自动推断的唯一知识是,您在整数值上有一个地址。在这一事实之后,理论上整数值后面可以有任何东西,工具不可能猜测指针实际上是整数数组的第一个元素

也就是说,您可以尝试添加一个定制的watch表达式(至少在Eclipse上,我不知道netbeans),它将指针强制转换为整数数组。我不知道你是否能用精确的数组长度施放。 类似于
(int[])bar
的东西肯定会起作用,但是这个表单可能会起作用
(int[10])bar

另一种解决方案是直接查看指针地址处的内存视图,但将原始endianness十六进制输出转换为整数值更像是一种心理运动


现在,如果指针总是分配给10个整数的内存块,那么最好考虑使用数组形式<代码> int bar(10)静态分配它;代码>

等待。。。那么,当人们需要在运行时检查条目时,他们会做什么呢?使用
printf
打印值似乎是一个糟糕的解决方案。我不知道其他方法,但我使用的是第一种方法:
*(bar+x)
。我刚刚尝试过,效果很好,谢谢!然而,我很困惑。这个方法不是只允许你一次检查一个条目吗?对于
int-foo[10]
代码,您将一次看到所有条目,但使用动态分配代码+您的方法,只能检查特定条目。@dvir如果调试器允许您以某种方式将指针强制转换到数组,则它可能会起作用。但除此之外,这是不可能的。它适用于数组,因为程序中有调试信息告诉调试器它是一个数组及其大小,或者调试器解析源代码以了解它是一个数组及其可能的限制。尝试添加
(int[100])foo
的手表在“wathces”窗口中将其转换为100个条目的数组,但它的价值观是不正确的。。。我想我得用另一种方法检查一下。无论如何谢谢你!想一想,你试过
bar[1]
?它应该可以工作,尤其是在打印它之类的代码中使用时(
printf(“bar[2]=%d\n”,bar[2]);
)。@dvir您应该添加答案,而不是将答案添加到标题中,您应该将您的答案标记为已接受。这是正确的做法,这样其他人就会知道有解决办法。好了,问题解决了。我更新了原始消息。非常感谢。