为什么在 GDB 调试期间 C 空终止符 `\0` 显示为 `\000`?

Why does a C null terminator `\0` show up as `\000` during GDB debugging?

在我的 GDB 调试过程中,我注意到空终止符,表示字符串的结尾,在 C 文件中显示为 [=11=],在 GDB 中显示为 [=12=]0显示存储此类字符的变量的值。

(gdb) print buffer[10]
 = 0 '[=10=]0'

谁能告诉我这是为什么?

这条记录'[=10=]'是一个字符常量(文字)的八进制转义序列。

一个八进制转义序列最多可以包含三个八进制数字。

GDB 似乎总是 使用 3 个八进制数字来显示字符转义 - 这是有充分理由的_考虑以下 string

const char *str = "";

然后

(gdb) p str
 = 0x555555556004 "[=11=]1[=11=]2[=11=]3[=11=]4[=11=]5"

这是因为 C 标准规定转义序列由 最大 的 3 个八进制数字组成。因此,如果你写:

"[=12=]a"

表示两个字符的字符串文字 - null 后跟 a。但是如果你写

""

表示一个字符的字符串文字:ASCII码1 - Start-of-Header控制字符。事实上,最短 在字符串文字中编写 ASCII null 后跟 数字 1(即 ASCII 代码 49)的方法是 "[ =16=]01" 其他可能性是 "[=17=]" "1" 使用字符串连接;单独转义"[=18=]";或者使用十六进制转义 \x...,所有这些都将更长....

因此,通过总是使用 3 个八进制数字,GDB 可以为字符串生成一致输出——这样当复制到 C 程序时将在运行时产生 same 字符串。此外,输出例程更简单,因为它不需要考虑以下字符。