为什么在GDB调试期间,C null终止符“\0”显示为“\000”?
在我的GDB调试会话期间,我注意到在显示存储此类字符的变量值时,表示字符串结尾的null终止符(在C文件中显示为为什么在GDB调试期间,C null终止符“\0”显示为“\000”?,c,gdb,character,C,Gdb,Character,在我的GDB调试会话期间,我注意到在显示存储此类字符的变量值时,表示字符串结尾的null终止符(在C文件中显示为\0)在GDB中显示为\000) (gdb) print buffer[10] $2 = 0 '\000' 有人能告诉我为什么吗?这条记录'\0'是字符常量(文字)的八进制转义序列 八进制转义序列最多可以包含三个八进制数字。GDB似乎总是使用3个八进制数字来显示字符转义-并且为了一个好的理由考虑下面的字符串 然后 这是因为C标准规定转义序列最多由3个八进制数字组成。因此,如果你写:
\0
)在GDB中显示为\000
)
(gdb) print buffer[10]
$2 = 0 '\000'
有人能告诉我为什么吗?这条记录
'\0'
是字符常量(文字)的八进制转义序列
八进制转义序列最多可以包含三个八进制数字。
GDB似乎总是使用3个八进制数字来显示字符转义-并且为了一个好的理由考虑下面的字符串
然后 这是因为C标准规定转义序列最多由3个八进制数字组成。因此,如果你写:"\0a"
它表示由两个字符组成的字符串文字-null后跟a
。但是如果你写
"\01"
它表示一个字符的字符串文字:ASCII代码1-标题控制字符的开头。事实上,在字符串文字中写入ASCII null后跟数字1
(即ASCII代码49)的最短方法是“\0001”
,其他可能的方法是使用字符串串联的“\0”“1”
;单独的转义符“\0\61”
;或者使用十六进制转义符\x..
,所有这些转义符都会更长
因此,通过始终使用3个八进制数字,GDB可以为字符串生成一致的输出-这样,当复制到C程序时,将在运行时生成相同的字符串。此外,输出例程更简单,因为它不需要考虑以下字符。因为字符串中的不可打印字符是由一些约定编写的八进制转义代码。
(gdb) print buffer[10]
$2 = 0 '\000'
"\01"