为什么在 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 字符串。此外,输出例程更简单,因为它不需要考虑以下字符。
在我的 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 字符串。此外,输出例程更简单,因为它不需要考虑以下字符。