在GDB调试过程中,我注意到null终止符字符表示字符串的结尾,在C文件中显示为\0
,在GDB中显示为\000
时显示存储这样一个字符的变量的值。
(gdb) print buffer[10]
$2 = 0 '\000'
有人能告诉我为什么吗?
发布于 2021-03-30 18:32:55
GDB似乎总是使用3个八进制数字来显示字符转义--对于一个好的reason_,请考虑以下字符串
const char *str = "\1\2\3\4\5";
然后
(gdb) p str
$1 = 0x555555556004 "\001\002\003\004\005"
这是因为C标准说转义序列最多由3位八进制数字组成。因此,如果你写:
"\0a"
它意味着两个字符的字符串文本- null,后面跟着a
。但如果你写
"\01"
它意味着一个字符的字符串文字: ASCII代码1-开始头控制字符.实际上,在字符串文本中用数字1
(即ASCII代码49)编写ASCII null的最短方式是"\0001"
,其他可能性是使用字符串级联的"\0" "1"
;单独转义"\0\61"
;或使用十六进制转义\x...
,所有这些都会更长.
因此,通过始终使用3位八进制数字,GDB可以为字符串生成一致的输出--这样,当复制到C程序时,运行时将产生相同的字符串。此外,输出例程更简单,因为它不需要考虑以下字符。
发布于 2021-03-30 17:55:46
此记录'\0'
是字符常量(文字)的八进制转义序列。
八进制转义序列最多可包含三个八进制数字。
https://stackoverflow.com/questions/66876002
复制相似问题