在 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 文件系统中的权限标志(例如:chmod
和 umask
参数)。
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
.
在 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 文件系统中的权限标志(例如:chmod
和 umask
参数)。
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
.