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

Ang*_*gus 8 c

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

#include<stdio.h>

struct s{
     unsigned char *p;
};

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

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

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

Set*_*gie 22

字符串文字不是类型unsigned char*.

你可能想输入const char*你的结构.如果没有,您可能不希望在不创建字符串的情况下为其分配字符串文字const,因为修改字符串文字所在的内存是非法的.


Sod*_*ved 8

正如@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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:更改字符串文字以删除可能的三字母

  • `?? /`是`\`的[trigraph](http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C).这意味着字符串将成为``\\ ????"`,所以`'\'`'被转义,它变成了`"\ ????"`.我不知道是否在字符串文字中替换了三字母,但所有这些都可能是错误的.发现它的+1. (3认同)
  • 要注意三字符,因为`"wtf ??!"`会变成`"wtf |"`.这是一个过时的键盘时代的旧构造,它缺少某些键. (2认同)