首页 > 解决方案 > ASCII 字符 14(和其他)在 C 中的字符串中分配时

问题描述

在 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)。

标签: cchargdbnon-ascii-characters

解决方案


14016八进制(以八为底)编写。由于历史原因,该语法'\016'使用八进制,即 60 年代的老式计算机将 6 位字符塞进 12 位、18 位甚至 36 位字中,其中八进制数字似乎是 3 位组的完美表示。

这一点可以在字符和字符串常量的 C 语法(许多语言从 C 中借用)和 Unix 文件系统中的权限标志(例如:chmodumask参数)中找到。

16is '\020', 20is '\024'and 32(ASCII space) is '\040'or '\x20'.


推荐阅读