以下代码行使用HP-UX的C ++编译器生成编译器警告:
strcpy(var, "string")
输出:
error #2167: argument of type "unsigned char *"
is incompatible with parameter of type "char *"
请注意:var
此处为unsigned char *
- 其数据类型超出了我的控制范围。
两个问题:
strcpy
,那么使上述代码行工作的安全方法是什么?答案 0 :(得分:3)
C++
严格检查std::strcpy
期望char*
且您的变量var
为unsigned char*
的类型。
幸运的是,在这种情况下,将指针强制转换为char*
是完全安全的:
std::strcpy(reinterpret_cast<char*>(var), "string");
这是因为,根据标准,char
,unsigned char
和signed 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 = #
编译器也会发出警告。因为它们是编译器中定义的不同类型。
因此,如果您编写&#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)
char
,signed char
和unsigned 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中的函数)。