在 C 中分配给字符串时的 ASCII 字符 14(和其他)

ASCII character 14 (and others) when assigned in string in C

在 GDB 中调试以下代码:

char* input = malloc(2);
input[0] = 14;
input[1] = 0;

根据GDB,字符串在内存中的值为:

input = "6"

同样,

char* input = malloc(2);
input[0] = 16;
input[1] = 0;

内存中的输入是"0"

为什么会这样?为什么 ASCII 值 14 不映射到 char 6?那么,为什么ASCII值16在内存中映射到0呢?

编辑:为了进一步混淆,使用以下代码:

char* input = malloc(2);
input[0] = 20;
input[1] = 0;

通过运行 gdb 中的上述代码段并使用以下命令:

p input

打印的结果值为:

 = 0x604010 "0"

这让我相信字符串输入的值是“\020”。

两个ASCII码映射到相同的内容"0"(即16和20)。

14 在八进制(八进制)中写成 016。语法 '6' 由于历史原因使用八进制,即 60 年代的古董计算机将 6 位字符塞进 12 位、18 位甚至 36 位字中,八进制数字似乎是组的完美表示3 位。

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

16'0'20'4' 并且 32 (ASCII space) 是 '0''\x20'.

这条记录6表示一个八进制转义序列。它的十进制值等于14.

来自 C 标准(6.4.4.4 字符常量)

octal-escape-sequence:
    \ octal-digit
    \ octal-digit octal-digit
    \ octal-digit octal-digit octal-digit

编译器也可以将值表示为十六进制转义序列,如 \xE

这个八进制转义序列0表示十进制数16。写成八进制转义序列的数字 20 看起来像 4.