c - 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)。
解决方案
14
用016
八进制(以八为底)编写。由于历史原因,该语法'\016'
使用八进制,即 60 年代的老式计算机将 6 位字符塞进 12 位、18 位甚至 36 位字中,其中八进制数字似乎是 3 位组的完美表示。
这一点可以在字符和字符串常量的 C 语法(许多语言从 C 中借用)和 Unix 文件系统中的权限标志(例如:chmod
和umask
参数)中找到。
16
is '\020'
, 20
is '\024'
and 32
(ASCII space) is '\040'
or '\x20'
.
推荐阅读
- python-3.x - 如何在 Ubuntu 中设置环境变量?
- flutter - MissingPluginException(在通道 plugins.flutter.io/share 上找不到方法共享的实现)
- asp.net-core - 如何在 ASP.NET Core MVC 中自动绑定登录用户
- python - 用于语音识别的 Python 代码不起作用
- airflow - Apache Airflow:在操作员执行之间存储下载文件的位置?
- gitlab - 如何为特定目录中的标签和更改触发管道
- python - 如何从 Django 模型中获取数据并进入 HTML 模板
- reactjs - 使用 nginx 反应 web 应用程序路由不适用于查询字符串
- laravel - Composer RuntimeException - 无法加载软件包 mews/purifier
- html - 我不希望我的导航栏覆盖背景图像的顶部