在我的 GDB 调试会话期间,我注意到空终止符,表示字符串的结尾,并\0在 C 文件中显示,\000当显示存储此类字符的变量的值时,在 GDB 中显示。
(gdb) print buffer[10]
$2 = 0 '\000'
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这是为什么?
GDB 似乎总是使用 3 个八进制数字来显示字符转义 - 并且有充分的理由_考虑以下字符串
const char *str = "\1\2\3\4\5";
Run Code Online (Sandbox Code Playgroud)
然后
(gdb) p str
$1 = 0x555555556004 "\001\002\003\004\005"
Run Code Online (Sandbox Code Playgroud)
这是因为 C 标准规定转义序列最多由 3 个八进制数字组成。因此,如果你写:
"\0a"
Run Code Online (Sandbox Code Playgroud)
它意味着两个字符的字符串文字 - null后跟a. 但是如果你写
"\01"
Run Code Online (Sandbox Code Playgroud)
它表示一个字符的字符串文字:ASCII 代码 1 -头开始控制字符。实际上,在字符串文字中写入 ASCII null 后跟数字(即 ASCII 代码 49)的最短方法是使用字符串连接;单独的转义;或使用十六进制转义,所有这些都会更长......1"\0001""\0" "1""\0\61"\x...
因此,通过始终使用 3 个八进制数字,GDB 可以为字符串生成一致的输出 - 这样当复制到 C 程序时,将在运行时产生相同的字符串。此外,输出例程更简单,因为它不需要考虑以下字符。