2011-05-24 46 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