我的編譯器(GCC)是顯示警告警告:在初始化指針目標中的符號性
#include<stdio.h>
struct s{
unsigned char *p;
};
int main() {
struct s a = {"??/??/????"}; //warning
printf("%s",a.p);
return 0;
}
警告有所不同:在初始化指針目標中的符號性
不同,請幫我這是爲什麼發出警告。
我的編譯器(GCC)是顯示警告警告:在初始化指針目標中的符號性
#include<stdio.h>
struct s{
unsigned char *p;
};
int main() {
struct s a = {"??/??/????"}; //warning
printf("%s",a.p);
return 0;
}
警告有所不同:在初始化指針目標中的符號性
不同,請幫我這是爲什麼發出警告。
字符串文字不是unsigned char*
類型。
您可能打算在您的結構中輸入const char*
。如果沒有,你可能不想爲它指定一個字符串文字而不用它const
,因爲修改字符串文字所在的內存是非法的。
將unsigned char *類型更改爲const char *。
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
''/''是'\'的[trigraph](http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C)。這意味着這個字符串會變成'「\\ ????」',所以用'\''轉義出來就變成'「\ ????」'。我不知道trigraphs是否在字符串文字內被替換,儘管如此,所有這些都可能是錯誤的。 +1發現它。 –
需要注意trigraphs,因爲'「wtf ??!」'會變成'「wtf |」'。這是一個古老的鍵盤結構,遺失了某些鍵。 –
@Chris那麼它們在字符串文字中被替換? –
可能有一些情況下,當改變編譯選項應該是解決一個合理的方式。
一個例子:
你有一些原型像這樣的API:
void Display (unsigned char * Text);
,你想這樣調用:
Display ("Some text");
您可以收到相同的警告(「通過'顯示'的參數1中的指針目標在簽名方面不同」)。
這個警告是由於旗-Wpointer-sign
的是,引用GNU編譯器的參考,「...由-Wall
和-pedantic
暗示,它可以與-Wno-pointer-sign
禁用」。
字符串文字不是'unsigned char *'類型。 –
@SethCarnegie - 編輯他的帖子後(我神祕地打敗了我),我正要發佈這個答案 - 這樣做,我會積極 –
@BrianRoach好的,謝謝。 –