2011-05-24 42 views
2

在这里,我检查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倍意味着什么?

对不起意识流的问题..希望有人能帮我清楚这一点。

回答

2

内存是字节可寻址这意味着每个字节都有一个不同的地址。然后你可以用来解释说一对字节为一个16位整数,四个字节为一个32位整数等等。这个格式说明符可以让你做到这一点 - 根据你对它的解释打印内存的内容。所以x/2x 0x7fff5fbff948将打印两个字大小(在这里64位)的整数,首先在地址0x7fff5fbff948,和第二地址0x7fff5fbff950

+0

首先,感谢您的回复。 好但两个64位整数清楚地对应于两个8字节的整数。由于每个字节都有其独特的地址,如果我做x/2x并在地址____48和____50处打印两个64位整数,则意味着应该与______48和______50重叠,并且在48的第三个字节中看不到任何重叠和50的第一个字节,然后。你能帮忙解释一下吗? – ae0709 2011-05-24 01:16:31

+0

为什么会有重叠? '0x50 - 0x48 = 8',即八个字节。 – 2011-05-24 01:33:23

+0

:)谢谢。愚蠢的错误...忘了我们在16岁。 – ae0709 2011-05-24 01:49:06