为什么可以使用字符串文字来初始化无符号字符数组,而不初始化无符号字符指针呢?

时间:2018-11-05 15:55:52

标签: c type-conversion

我尝试使用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 *的隐式转换。

1 个答案:

答案 0 :(得分:2)

从技术上讲,因为该标准明确允许使用字符串文字(6.7.9p14)初始化(任意)字符类型的数组:

  

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

在大多数指针转换中,标准要求显式强制转换(6.5.4p3):

  

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

直觉上,因为您可以做到:

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

或换句话说,因为您可以使用其他整数类型初始化整数类型而无需显式强制转换。