首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在GDB调试期间C空终止符`\0‘显示为`\000’?

为什么在GDB调试期间C空终止符`\0‘显示为`\000’?
EN

Stack Overflow用户
提问于 2021-03-30 17:48:47
回答 2查看 1.2K关注 0票数 1

在GDB调试过程中,我注意到null终止符字符表示字符串的结尾,在C文件中显示为\0,在GDB中显示为\000时显示存储这样一个字符的变量的值。

代码语言:javascript
运行
复制
(gdb) print buffer[10]
$2 = 0 '\000'

有人能告诉我为什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-30 18:32:55

GDB似乎总是使用3个八进制数字来显示字符转义--对于一个好的reason_,请考虑以下字符串

代码语言:javascript
运行
复制
const char *str = "\1\2\3\4\5";

然后

代码语言:javascript
运行
复制
(gdb) p str
$1 = 0x555555556004 "\001\002\003\004\005"

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

代码语言:javascript
运行
复制
"\0a"

它意味着两个字符的字符串文本- null,后面跟着a。但如果你写

代码语言:javascript
运行
复制
"\01"

它意味着一个字符的字符串文字: ASCII代码1-开始头控制字符.实际上,在字符串文本中用数字1 (即ASCII代码49)编写ASCII null的最短方式是"\0001",其他可能性是使用字符串级联的"\0" "1";单独转义"\0\61";或使用十六进制转义\x...,所有这些都会更长.

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

票数 6
EN

Stack Overflow用户

发布于 2021-03-30 17:55:46

此记录'\0'是字符常量(文字)的八进制转义序列。

八进制转义序列最多可包含三个八进制数字。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66876002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档