我的编译器(gcc)正在显示警告
#include<stdio.h>
struct s{
unsigned char *p;
};
int main() {
struct s a = {"??/??/????"}; //warning
printf("%s",a.p);
return 0;
}
警告:初始化中的指针目标在签名方面有所不同
请帮我解释为什么会出现此警告。
答案 0 :(得分:21)
字符串文字的类型不是unsigned char*
。
您可能打算在结构中键入const char*
。如果没有,您可能不希望在不使用const
的情况下为其分配字符串文字,因为修改字符串文字所在的内存是非法的。
答案 1 :(得分:7)
正如@Seth Carnegie所说,字符串文字的类型为char*
,而不是unsigned char*
。因此,您可以使用显式类型转换来避免此警告。即。
#include<stdio.h>
struct s{
unsigned char *p;
};
int main() {
struct s a = {(unsigned char *)"?""?/?""?/????"}; // no warning
printf("%s",a.p);
return 0;
}
修改:更改字符串文字以删除可能的trigraph
答案 2 :(得分:4)
在某些情况下,更改编译器选项应该是解决问题的合理方法。
一个例子:
你有一个带有这样的原型的API:
void Display (unsigned char * Text);
你想要这样打电话:
Display ("Some text");
你可能得到相同的警告(“传递'显示'的参数1中的指针目标在签名方面有所不同”。)
此警告是由-Wpointer-sign
标志引用的,引用GNU编译器引用,“ ...”由-Wall
和-pedantic
隐含,可以使用{ {1}} ”。
答案 3 :(得分:2)
将unsigned char *类型更改为const char *。