警告:初始化中的指针目标在签名方面有所不同

时间:2011-12-09 05:15:05

标签: c

我的编译器(gcc)正在显示警告

#include<stdio.h>

struct s{
     unsigned char *p;
};

int main() {
    struct s a = {"??/??/????"}; //warning
    printf("%s",a.p);
    return 0;
}

警告:初始化中的指针目标在签名方面有所不同

请帮我解释为什么会出现此警告。

4 个答案:

答案 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 *。