如何解决在 C 中的字符串中分配时的 ASCII 字符 14和其他
在 GDB 中调试以下代码:
char* input = malloc(2);
input[0] = 14;
input[1] = 0;
字符串在内存中根据GDB的值是:
input = "\016"
同样,
char* input = malloc(2);
input[0] = 16;
input[1] = 0;
内存中的输入是"\020"
。
为什么会这样?为什么 ASCII 值 14 不映射到 char \016
?那么,为什么 ASCII 值 16 会映射到内存中的 \020
?
编辑:为了进一步混淆,请使用以下代码:
char* input = malloc(2);
input[0] = 20;
input[1] = 0;
通过在 gdb 中运行上述代码段并使用以下命令:
p input
打印的结果值为:
$1 = 0x604010 "\020"
这让我相信字符串输入的值是“\020”。
两个 ASCII 数字映射到相同的内容 "\020"
(即 16 和 20)。
解决方法
14
以八进制(基数为 8)写成 016
。语法 '\016'
出于历史原因使用八进制,即 60 年代的古董计算机在 12 位、18 位甚至 36 位字中塞满了 6 位字符,而八进制数字似乎是组的完美表示3 位。
可以在字符和字符串常量的 C 语法(许多语言从 C 借用)和 Unix 文件系统中的权限标志(例如:chmod
和 umask
参数)中找到这种痕迹.
16
为 '\020'
,20
为 '\024'
,32
(ASCII 空间)为 '\040'
或 '\x20'
。
这条记录 \016
代表一个八进制转义序列。它的十进制值等于 14
。
来自 C 标准(6.4.4.4 字符常量)
octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit
编译器也可以将值表示为十六进制转义序列,如 \xE
。
这个八进制转义序列 \020
代表十进制数 16
。写成八进制转义序列的数字 20
看起来像 \024
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。