C 为什么可以';我在gdb中使用printf和临时结构的字符串成员

C 为什么可以';我在gdb中使用printf和临时结构的字符串成员,c,gdb,C,Gdb,下面是一个简单的程序: #include <stdio.h> #include <string.h> typedef struct { char str[10]; } my_struct; static my_struct s1; int main() { char *temp_str = "test"; strcpy(s1.str, temp_str); printf("%s\n", s1.str);

下面是一个简单的程序:

#include <stdio.h>
#include <string.h>

typedef struct {
        char str[10];
} my_struct;

static my_struct s1;

int main()
{
        char *temp_str = "test";
        strcpy(s1.str, temp_str);
        printf("%s\n", s1.str);
}
为什么最后一个命令不起作用?在更复杂的情况下,直接访问变量(s1.str)没有那么干净,在本例中有没有有效的方法将printf与$tmp一起使用?这就是GDB7.2

但是,以下方法确实有效:

(gdb) set $tmp_str = s1.str
(gdb) printf "%s\n", $tmp_str
test
另一个有趣的问题是,如果我向结构添加一个int(在本例中,x-设置为4),我可以成功地执行以下操作:

(gdb) set $tmp = s1
(gdb) printf "%d\n", $tmp.x
4

可能是因为$tmp指向的是一个结构(s1),而不是字符数组(s1.str),所以gdb在这方面非常聪明,但通常会从字面上理解

set $tmp = s1
一般指:

set $tmp = (address of)s1
因此$tmp只是一个指针,从技术上讲,您必须将$tmp转换/强制为(struct my_struct)类型的指针,您可以从中引用struct内容str

set $tmp = (struct my_struct)s1
但我认为这在gdb中不起作用(不确定,试试吧!)。无论如何:

set $tmp = s1.str
printf "%s\n", $tmp

不过可能对您有用。

无论如何,这在gdb-7.6.1上运行良好。
printf“%s\n”、$tmp.str
printf“%s\n”、$tmp->str
都输出我在问题中提到的“test”,即您建议的最后一件事确实有效。此外,将其强制转换为my_struct(不需要在类型前面添加额外的“struct”)也没有帮助。仍然希望得到一个答案,但如果上面的评论中的“否”是正确的,那么这可能只是我的(有点旧的)gdb版本中的一个bug。
set $tmp = s1.str
printf "%s\n", $tmp