2011-12-09 53 views
6

我的編譯器(GCC)是顯示警告警告:在初始化指針目標中的符號性

#include<stdio.h> 

struct s{ 
    unsigned char *p; 
}; 

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

警告有所不同:在初始化指針目標中的符號性

不同,請幫我這是爲什麼發出警告。

+4

字符串文字不是'unsigned char *'類型。 –

+0

@SethCarnegie - 編輯他的帖子後(我神祕地打敗了我),我正要發佈這個答案 - 這樣做,我會積極 –

+0

@BrianRoach好的,謝謝。 –

回答

16

字符串文字不是unsigned char*類型。

您可能打算在您的結構中輸入const char*。如果沒有,你可能不想爲它指定一個字符串文字而不用它const,因爲修改字符串文字所在的內存是非法的。

1

將unsigned char *類型更改爲const char *。

6

As @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

+3

''/''是'\'的[trigraph](http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C)。這意味着這個字符串會變成'「\\ ????」',所以用'\''轉義出來就變成'「\ ????」'。我不知道trigraphs是否在字符串文字內被替換,儘管如此,所有這些都可能是錯誤的。 +1發現它。 –

+2

需要注意trigraphs,因爲'「wtf ??!」'會變成'「wtf |」'。這是一個古老的鍵盤結構,遺失了某些鍵。 –

+0

@Chris那麼它們在字符串文字中被替換? –

4

可能有一些情況下,當改變編譯選項應該是解決一個合理的方式。

一個例子:

你有一些原型像這樣的API:

void Display (unsigned char * Text); 

,你想這樣調用:

Display ("Some text"); 

可以收到相同的警告(「通過'顯示'的參數1中的指針目標在簽名方面不同」)。

這個警告是由於旗-Wpointer-sign的是,引用GNU編譯器的參考,「...由-Wall-pedantic暗示,它可以與-Wno-pointer-sign禁用」。