你声明了三个字符串:
p2
指向的是sample1
str[0]
指向的是sample1
str[1]
指向的是sample2
由于它们都是“字符串字面量”,所以不能被更改,且以只读方式存储。
编译器可以识别到你实际上只有两个唯一的字符串,因此只存储这两个字符串(这取决于实现)。
0x4005f8
具体是什么?
在内存中,你可能会找到类似于以下内容:
0x0000004005f8 's'
0x0000004005f9 'a'
0x0000004005fa 'm'
0x0000004005fb 'p'
0x0000004005fc 'l'
0x0000004005fd 'e'
0x0000004005fe '1'
0x0000004005ff '\0'
0x000000400600 's'
0x000000400601 'a'
0x000000400602 'm'
0x000000400603 'p'
0x000000400604 'l'
0x000000400605 'e'
0x000000400606 '2'
0x000000400607 '\0'
...
0x7fffffffdb20 0xf8
0x7fffffffdb21 0x05
0x7fffffffdb22 0x40
0x7fffffffdb23 0x00
0x7fffffffdb24 0x00
0x7fffffffdb25 0x00
0x7fffffffdb26 0x00
0x7fffffffdb27 0x00
...
0x7fffffffdb38 0xf8
0x7fffffffdb39 0x05
0x7fffffffdb3a 0x40
0x7fffffffdb3b 0x00
0x7fffffffdb3c 0x00
0x7fffffffdb3d 0x00
0x7fffffffdb3e 0x00
0x7fffffffdb3f 0x00
也就是说:
p2
变量:
- 位于地址
0x7fffffffdb38
- 值为
0x4005f8
str[0]
变量:
- 位于地址
0x7fffffffdb20
- 值为
0x4005f8
- 内存地址
0x4005f8
是 sample1
字符串的开头,即字符 s
- 内存地址
0x4005f9
是 sample1
字符串的下一个字符,即字符 a
- ...
0x4005fa
是 m
- ...
0x4005fb
是 p
- ...
0x4005fc
是 l
- ...
0x4005fd
是 e
- ...
0x4005fe
是 1
- ...
0x4005ff
是 \0
或 "nul",表示字符串结束的标志
当你测试 p2 == str [0]
时,实际上是在测试两个变量存储的值是否相同。这些值是字符串的基本地址。它们持有“相同的”字符串,因此具有相同的值。
完全可以将“相同的”字符串(即相同的文本)存储在两个不同的内存位置中,在这种情况下,此测试将失败。
你实际上是在说这两个字符串是“相同的实例”,它们驻留在内存中的相同位置,因此必须具有相同的内容。
... 那么如何打印它呢?
你可以使用 x/1c
逐个字符打印,或者使用 x/1s
打印以 nul 结尾的字符串(gdb
正确处理 C 字符串)。
main.c
:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char *p2 = "sample1";
char *str[2] = { "sample1", "sample2" };
if (p2 == str[0]) {
printf("true\n");
}
return 0;
}
编译:
gcc main.c -o main -g
运行:
$ gdb ./main
[...]
(gdb) start
Temporary breakpoint 1 at 0x4005a5: file main.c, line 4.
Starting program: /home/attie/stackoverflow/56475101/main
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffe418) at main.c:4
4 int main(int argc, char *argv[]) {
(gdb) list
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main(int argc, char *argv[]) {
5 char *p2 = "sample1";
6 char *str[2] = { "sample1", "sample2" };
7
8 if (p2 == str[0]) {
9 printf("true\n");
10 }
(gdb) b 8
Breakpoint 2 at 0x4005cc: file main.c, line 8.
(gdb) c
Continuing.
Breakpoint 2, main (argc=1, argv=0x7fffffffe418) at main.c:8
8 if (p2 == str[0]) {
(gdb) print p2
$1 = 0x400684 "sample1"
(gdb) print str[0]
$2 = 0x400684 "sample1"
(gdb) print str[1]
$3 = 0x40068c "sample2"
从地址0x400684
打印三个"字符串":
最初的回答:
(gdb) x/3s 0x400684
0x400684: "sample1"
0x40068c: "sample2"
0x400694: "true"
从地址0x400684
打印16个字符:
最初的回答:
(gdb) x/16c 0x400684
0x400684: 115 's' 97 'a' 109 'm' 112 'p' 108 'l' 101 'e' 49 '1' 0 '\000'
0x40068c: 115 's' 97 'a' 109 'm' 112 'p' 108 'l' 101 'e' 50 '2' 0 '\000'
打印存储在p2
、str[0]
和str[1]
中的地址:
最初的回答:
(gdb) x/1a &p2
0x7fffffffe308: 0x400684
(gdb) x/1a &str[0]
0x7fffffffe310: 0x400684
(gdb) x/1a &str[1]
0x7fffffffe318: 0x40068c
sample1
的一个实例。 - kiran Biradar