c - 当在 C 中的字符串中分配时,ASCII 字符 14(和其他)

标签 c char gdb non-ascii-characters

在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 写作 016 为八进制(以八为基数)。语法 '\016' 使用八进制是出于历史原因,即 60 年代的古董计算机将 6 位字符塞进 12 位、18 位甚至 36 位字中,这些字用八进制数字表示似乎是 3 位组的完美表示。

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

16'\020'20'\024'32(ASCII 空格)为 '\040''\x20'

关于c - 当在 C 中的字符串中分配时,ASCII 字符 14(和其他),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66093614/

相关文章:

c - 类型转换,结构与转换

c - 在 Swift 中获取指向 C char 数组的指针

c++ - 使用成员访问运算符 (.) 初始化结构中的 char 数组

c++ - 无法在Mac OS X上的Visual Code中调试C++

c++ - 查找僵尸线程的来源

c - 解析来自 I2C 的数据

c++ - GCC 将共享库链接到可执行文件

C - 未选择的选项

C++ char数组赋值

linux - 为什么内存地址在 Ubuntu 而不是 Redhat 中发生变化