在这里,我检查C语言编写的一个简单的程序,节省了字符指针,上面写着一串GDB问题“你好,世界!\ n”个与C程序
这里是我的GDB的输出..我很困惑,在GDB的不一致,什么是正确的位置:
$ gcc -g pointer.c
$ gdb -q ./a.out
Reading symbols for shared libraries .. done
(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str[20];
6 char *pointer;
7
8 strcpy(str, "Hello, world!\n");
9 pointer = str;
10 printf("%s",pointer);
(gdb)
11 }
(gdb) break 10
Breakpoint 1 at 0x100000ed1: file pointer.c, line 10.
(gdb) run
Starting program: /Users/___/a.out
Reading symbols for shared libraries +. done
Breakpoint 1, main() at pointer.c:10
10 printf("%s",pointer);
(gdb) print pointer
$1 = 0x7fff5fbff950 "Hello, world!\n"
(gdb) print &pointer
$2 = (char **) 0x7fff5fbff948
(gdb) x/s 0x7fff5fbff950
0x7fff5fbff950: "Hello, world!\n"
(gdb) x/16b 0x7fff5fbff950
0x7fff5fbff950: "Hello, world!\n"
0x7fff5fbff95f: ""
0x7fff5fbff960: "x??_?"
0x7fff5fbff967: ""
0x7fff5fbff968: "՝?Y4?K\033???_?"
0x7fff5fbff977: ""
0x7fff5fbff978: "?\016"
0x7fff5fbff97b: ""
0x7fff5fbff97c: "\001"
0x7fff5fbff97e: ""
0x7fff5fbff97f: ""
0x7fff5fbff980: ""
0x7fff5fbff981: ""
0x7fff5fbff982: ""
0x7fff5fbff983: ""
0x7fff5fbff984: ""
(gdb) x/x 0x7fff5fbff950
0x7fff5fbff950: 0x48
(gdb) x/x 0x7fff5fbff951
0x7fff5fbff951: 0x65
(gdb) x/s 0x7fff5fbff951
0x7fff5fbff951: "ello, world!\n"
(gdb) print &pointer
$3 = (char **) 0x7fff5fbff948
(gdb) x/x 0x7fff5fbff948
0x7fff5fbff948: 0x00007fff5fbff950
(gdb) x/x 0x7fff5fbff949
0x7fff5fbff949: 0x4800007fff5fbff9
(gdb) x/2x 0x00007fff5fbff950
0x7fff5fbff950: 0x77202c6f6c6c6548 0x00000a21646c726f
我的问题是:
的信息有多少字节存储在存储器中,这些位置中的一个?当我在地址 0x7fff5fbff950,内容似乎是0x48(ASCII“H”)。那么这是否意味着,每个内存地址只存储一个字节的信息?好。我们假设它的确如此。然后,我对打印&指针给出的地址运行相同的“X/X”命令:我值0x00007fff5fbff950,这点我承认(忽略前导零)0x7fff5fbff948
是“你好,世界的开始! \ n“内存中的字符串。
现在怎么能0x00007fff5fbff948包含0x00007fff5fbff950,仍然有内存只有一个字节?所以我看看0x00007fff5fbff949 ...现在这又告诉我,我们每次只看一个字节,因为我们失去了尾随的0x50(我知道小端,所以也许我的措辞容易混淆)。
现在我得到真的疯了......我尝试做X/2X 0x7fff5fbff948,我有两个巨大的十六进制数袭击......在一个时间
所以在内存中的数据存储字节,并以某种方式x/x有时会给我每个内存一个字节,有时会给我一个完整的地址?我怎样才能控制调试器输出的内容? x/x应检查此地址的内容并以十六进制输出。我可以用x/B为一个单字节,X/2B 2个字节......但X/2倍意味着什么?
对不起意识流的问题..希望有人能帮我清楚这一点。
首先,感谢您的回复。 好但两个64位整数清楚地对应于两个8字节的整数。由于每个字节都有其独特的地址,如果我做x/2x并在地址____48和____50处打印两个64位整数,则意味着应该与______48和______50重叠,并且在48的第三个字节中看不到任何重叠和50的第一个字节,然后。你能帮忙解释一下吗? – ae0709 2011-05-24 01:16:31
为什么会有重叠? '0x50 - 0x48 = 8',即八个字节。 – 2011-05-24 01:33:23
:)谢谢。愚蠢的错误...忘了我们在16岁。 – ae0709 2011-05-24 01:49:06