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

在我的 GDB 调试会话期间,我注意到空终止符,表示字符串的结尾,并在 C 文件中显示,00当显示存储此类字符的变量的值时,在 GDB 中显示。

(gdb) print buffer[10]
$2 = 0 '00'

谁能告诉我这是为什么?

回答

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

const char *str = "12345";

然后

(gdb) p str
$1 = 0x555555556004 "0102030405"

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

"a"

它意味着两个字符的字符串文字 - null后跟a. 但是如果你写

"1"

它表示一个字符的字符串文字:ASCII 代码 1 -头开始控制字符。实际上,在字符串文字中写入 ASCII null 后跟数字(即 ASCII 代码 49)的最短方法是使用字符串连接;单独的转义;或使用十六进制转义,所有这些都会更长......1"001""" "1""61"x...

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


以上是为什么在GDB调试期间C空终止符``显示为`00`?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>