c - 为什么可以使用字符串文字来初始化 unsigned char 数组,但不能初始化 unsigned char 指针?
问题描述
我尝试使用gcc -Wall -pedantic-errors -std=c89
以下代码进行编译:
int main(){
unsigned char a[] = "foo";
unsigned char *b= "foo";
unsigned char *c= ( unsigned char *) "foo";
return 0;
}
为什么第二次初始化会引发错误pointer targets in initialization differ in signedness
,但允许其他两个声明?
似乎在第二种情况下,没有完成从char *
to的隐式转换。unsigned char *
解决方案
从技术上讲,因为标准明确允许(任何)字符类型的数组可以使用字符串文字(6.7.9p14)进行初始化:
字符类型的数组可以由字符串文字或 UTF-8 字符串文字初始化,可选用大括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素。
而对于大多数指针转换,标准需要显式转换(6.5.4p3):
涉及指针的转换,除了6.5.16.1的约束允许的情况外,应通过显式转换来指定。
直观地说,因为你可以这样做:
unsigned char a0 = 'f', a1 = 'o', a2 = 'o';
或者换句话说,因为您可以使用不同的整数类型初始化整数类型,而无需显式强制转换。
推荐阅读
- r - 更改 ggplot2 图例以区分线型(solid 和 longdash 看起来相似)
- spring-boot - Spring Integration - 过滤器中的请求验证
- node.js - 未找到 AgentContext/null
- docker - 从另一个容器上的一个 docker 容器运行命令是一种好习惯吗?
- jenkins - 如何发布来自 Jenkins 的最新 HTML 报告?
- google-sheets - 当单元格是URL时使用importjson,Gsheets中的JSON格式
- python - 如何使两帧动画工作pygame
- angular - Angular FormControl 值在服务内部设置为 null
- python-3.x - VS 代码不会在终端 Python 中打印完整的字符串
- javascript - 多个网络工作者绘制画布图像数据