char *和unsigned char *之间不兼容?

时间:2018-03-08 05:14:11

标签: c++ casting char-pointer

以下代码行使用HP-UX的C ++编译器生成编译器警告:

strcpy(var, "string")

输出:

error #2167: argument of type "unsigned char *" 
    is incompatible with parameter of type "char *"

请注意:var此处为unsigned char * - 其数据类型超出了我的控制范围。

两个问题:

  1. 不兼容性在这两种类型的背景下意味着什么?如果编译器被迫接受转换会发生什么?一个例子将不胜感激。
  2. 如果我必须使用strcpy,那么使上述代码行工作的安全方法是什么?

3 个答案:

答案 0 :(得分:3)

C++严格检查std::strcpy期望char*且您的变量varunsigned char*的类型。

幸运的是,在这种情况下,将指针强制转换为char*是完全安全的:

std::strcpy(reinterpret_cast<char*>(var), "string");

这是因为,根据标准,charunsigned charsigned char可以互为别名。

答案 1 :(得分:1)

在C标准中,char是Impementation Defined。 ANSI C提供三种字符类型(所有三种字符都占一个字节):char,signed char,unsigned char。不只是短,int,只有两个。

您可以尝试:

char *str="abcd"; signed char *s_str = str;

编译器将警告代码的第二行是错误。它就像:

short num = 10; unsigned short *p_num = &num;

编译器也会发出警告。因为它们是编译器中定义的不同类型。

因此,如果您编写&#39; strcpy((char *)var,&#34; string&#34;)&#39;,代码只需复制&#34; string&#34;中的字符。 #39; s空间到var的空间。这里是否有错误取决于你如何处理&#39; var&#39;。因为&#39; var&#39;不是&#39; char *&#39;

答案 2 :(得分:1)

charsigned charunsigned char是C ++中的不同类型。指向它们的指针是不兼容的 - 例如强制编译器将unsigned char *转换为char *以便将其传递给strcpy()正式导致未定义的行为 - 当指针随后被解除引用时 - 在几个案例中。因此警告。

而不是使用strcpy()(因此必须强制转换指针),你最好不要这样做(C ++ 11及更高版本)

const char thing[] = "string";
std::copy(std::begin(thing), std::end(thing), var);

没有未定义的行为。

更好的是,考虑使用标准容器,例如std::vector<unsigned char>std::string,而不是使用原始数组。所有标准容器都提供了访问其数据的方法(例如,用于将合适的指针传递给遗留API中的函数)。