代码:
int a;
int b;
char test[011];
a = 0x41414141;
b = 0x42424242;
gdb输出
(gdb) x/s &a
0x7fffffffde1c: "AAAA@\336\377\377\377\177"
(gdb) x/s &b
0x7fffffffde18: "BBBBAAAA@\336\377\377\377\177"
在代码中 a 使用 AAAA 进行初始化, b 使用 BBBB 进行初始化。 我需要了解以下内容。
答案 0 :(得分:4)
为什么
b
的位置有BBBBAAAA而不是BBBB应该有?
它没有。 b的位置有0x42424242(当解释为int
时)。但是,通过运行x/s &b
(而非print b
),您告诉gdb打印从b
位置开始的字符串,而不是打印存储在那里的int
。
恰好存储在b
位置的字节看起来像" BBBB"当解释为ASCII时,之后的字节看起来像" AAAA @"当解释为ASCII时,然后还有一些字节不是可打印的字符,所以gdb将它们打印为转义码,然后是0字节(表示字符串的结尾)。
@ \ 336 \ 377 \ 377 \ 377 \ 177表示什么?
@是角色@。 \ 336和\ 337和\ 177是转义码 - @ aren&t; t可显示字符后面的字节,因此gdb将它们打印为八进制转义码(使用C语法)。