带有C程序的GDB问题

| 在这里,我正在研究一个用C编写的简单程序,该程序将char指针保存到一个字符串,该字符串表示“你好,世界!\\ n \” 这是我的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 \')。那么这是否意味着每个内存地址仅存储一个字节的信息?好。假设确实如此。然后,在print&pointer指定的地址上运行相同的“ x / x \”命令:0x7fff5fbff948 我得到的值为0x00007fff5fbff950,我知道(忽略前导零)是内存中\“ Hello,world!\\ n \”字符串的开始。 现在0x00007fff5fbff948如何包含0x00007fff5fbff950并且仍然只有一个字节的内存?所以我看一下0x00007fff5fbff949 ...,这现在再次告诉我,我们每次都只看一个字节,因为我们丢失了尾随的0x50(我知道小尾数法,所以我可能会在措辞上令人困惑)。 现在我真的很生气...我尝试做x / 2x 0x7fff5fbff948,然后我受到两个巨大的十六进制数字的攻击... 因此,内存中的数据一次存储一个字节,而x / x有时会给每个内存一个字节,有时给我一个完整的地址吗?如何控制调试器将输出什么? x / x应该检查该地址的内容并以十六进制输出。我可以将x / b用于单个字节,将x / 2b用于2个字节...但是x / 2x表示什么? 很抱歉出现意识问题。希望有人可以帮助我解决这个问题。     
已邀请:
存储器是字节可寻址的,这意味着每个字节都有一个不同的地址。然后,您可以将一对字节解释为16位整数,将四个字节解释为32位整数,依此类推。格式说明符可以让您做到这一点-根据您对它的解释打印内存的内容。因此,
x/2x 0x7fff5fbff948
将打印两个字长(此处为64位)的整数,第一个在地址
0x7fff5fbff948
,第二个在地址
0x7fff5fbff950
。     

要回复问题请先登录注册