2

我尝试像这样打印数组的内容,并且成功:

p/x t->arr
$1 = {0x63, 0x61, 0x74, 0x31, 0x2e, 0x6a, 0x70, 0x67, 0x0 <repeats 248 times>}

但是,当我尝试这样的不同方式时:

(gdb) p &t->arr
$2 = (char (*)[256]) 0x60c4d0
 p/100x *0x60c4d0
Item count other than 1 is meaningless in "print" command.

t->arr 在结构中定义为 arr[256]。我做错了吗?

4

3 回答 3

3

gdb中,您可以将文字指针值转换为您认为合适的任何类型。因此,如果您想将地址视为指向数组的指针,您可以简单地将其转换为这样,然后打印出来。

(gdb) p argv
$1 = (char **) 0x7fffffffe898
(gdb) p *(char *(*)[2])0x7fffffffe898
$2 = {0x7fffffffeae1 "/tmp/a.out", 0x0}
于 2013-08-13T00:06:19.327 回答
2
p/100x *0x60c4d0

在这里,您要求 gdb 打印内存位置 0x60c4d0 中的 100 个元素,这意味着更少,因为内存位置 0x60c4d0 只能包含一个元素。因此,错误表明除 1 之外的任何内容都是无意义的。

p/256x 0x60c4d0

这给出了从 0x60c4d0 开始的 256 个地址,这将是数组中 256 个字符元素中每个元素的地址。

于 2013-08-12T23:42:51.437 回答
0

有两个方面需要考虑:

  1. 给定一个指针,GDB 打印地址而不是它指向的内容。所以,如果你有一个 char * 类型的变量 pc,p 将只打印地址。

  2. 取消引用指针变量会得到它所指向的值,因为 GDB 可以确定它的类型。所以,如果你打印 *pc,你会得到这个值,因为类型是已知的。另一方面,如果您有 char [25] 类型的 pa,p 将知道类型并将其视为数组并打印其元素。

但是,如果您希望 GDB 将地址视为数组,则必须教它。因此,当您使用数组 start 作为地址时,GDB 现在需要知道类型: - 如果您说它是 char *,GDB 将打印地址。- 如果你说它是一个 char * 并取消引用它,GDB 将在该地址打印 char 值。- 如果你说它是一个字符 (*) [25],GDB 将打印那些元素。

于 2014-01-02T09:09:21.770 回答