【问题标题】:Why is it ok to use a string literal to initialize an unsigned char array but not to initialize an unsigned char pointer?为什么可以使用字符串文字来初始化 unsigned char 数组,但不能初始化 unsigned char 指针?
【发布时间】:2019-04-09 00:20:18
【问题描述】:

我已尝试使用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 *unsigned char *的隐式转换没有完成。

【问题讨论】:

  • 没有从char*unsigned char* 的“隐式转换”。这就是第二个失败的原因。
  • 对,第一个也没有执行该转换。它正在逐元素复制 char 数组

标签: c type-conversion


【解决方案1】:

从技术上讲,因为标准明确允许(任何)字符类型的数组用字符串字面量(6.7.9p14)进行初始化:

字符类型的数组可以由字符串初始化 文字或 UTF-8 字符串文字,可选择用大括号括起来。 字符串文字的连续字节(包括终止的 null 如果有空间或数组大小未知,则字符) 初始化数组的元素。

虽然对于大多数指针转换,标准要求显式转换 (6.5.4p3):

涉及指针的转换,除 6.5.16.1 的约束,应通过显式指定 演员表。

直觉上,因为你可以这样做:

unsigned char a0 = 'f', a1 = 'o', a2 = 'o';

或者换句话说,因为你可以用不同的整数类型初始化一个整数类型,而不必显式地强制转换。

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 1970-01-01
    • 2015-08-12
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多