Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在GDB调试期间,C null终止符“\0”显示为“\000”?_C_Gdb_Character - Fatal编程技术网

为什么在GDB调试期间,C null终止符“\0”显示为“\000”?

为什么在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个八进制数字组成。因此,如果你写:

在我的GDB调试会话期间,我注意到在显示存储此类字符的变量值时,表示字符串结尾的null终止符(在C文件中显示为
\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"