arrays - 用clang中的大括号括起来的列表初始化的char数组中的尾随符号是什么?
问题描述
#include <stdio.h>
int main(int argc, const char *argv[]) {
char name1[] = {'f','o','o'};
char name2[] = "foo";
printf("%s\n", name1);
printf("%s\n", name2);
return 0;
}
运行上面的代码会导致:
foox\363\277\357\376
foo
Program ended with exit code: 0
那么,这两个初始化器有什么区别呢?
解决方案
name1
是三个字符的数组{'f', 'o', 'o'}
。
name2
是一个由四个字符组成的数组{'f', 'o', 'o', '\0'}
。
printf("%s", ...)
需要一个以空字符结尾的数组。因为name1
不是,所以您开始取消引用超出数组末尾的字符,这些字符可能具有传统的未定义行为。
推荐阅读
- python - 从括号出现开始的分隔字符串(正则表达式)
- flutter - lib中的项目文件不存在URI目标
- python - 如何使用 python 将 WorkMail 电子邮件附件保存到 tmp 位置并在 lambda 中推送到 s3
- javascript - 使用 jsdom 导出 d3 __data__ 属性
- python - 在python中将.wav文件转换为.ogg格式
- python - 错误:标量变量的索引无效,无法计算高斯羽流模型中的 sigma
- python - 如何使用 ssl 加密 cx_oracle 连接?
- reactjs - 如何垂直对齐 TextField 标签?
- python - 如何使用 Python Image Library 将 libvirt 流转换为不同的图像类型?
- node.js - 如何让用户在每个页面刷新?JWT 令牌,MERN 堆栈