2011-12-09 8 views
6

मेरे संकलक (जीसीसी) में चेतावनीचेतावनी: प्रारंभ में सूचक लक्ष्य signedness

#include<stdio.h> 

struct s{ 
    unsigned char *p; 
}; 

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

चेतावनी दिखा रहा है अलग: प्रारंभ में सूचक लक्ष्य signedness

में मतभेद है कृपया मुझे क्यों इस चेतावनी आता है करने के लिए मदद ।

+4

स्ट्रिंग अक्षर प्रकार 'हस्ताक्षरित चार *' प्रकार के नहीं हैं। –

+0

@ सेठ कार्नेगी - मैं अपनी पोस्ट को संपादित करने के बाद उत्तर के रूप में पोस्ट करने वाला था (जो रहस्यमय मुझे मारता है) - ऐसा करें और मैं –

+0

@BrianRoach ठीक कर दूंगा, धन्यवाद। –

उत्तर

16

स्ट्रिंग अक्षर unsigned char* प्रकार के नहीं हैं।

शायद आपको अपनी संरचना में const char* टाइप करना था। यदि नहीं, तो संभवतः आप इसे const बनाने के बिना इसे एक स्ट्रिंग अक्षर निर्दिष्ट नहीं करना चाहते हैं, क्योंकि स्मृति को संशोधित करना अवैध है जिसमें स्ट्रिंग अक्षर रहते हैं।

1

हस्ताक्षरित चार * प्रकार को कॉन्स्ट char * में बदलें।

6

जैसा कि @ सेठ कार्नेगी ने कहा, स्ट्रिंग अक्षर 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

'?? /' है [ट्रिगर] (http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C) '\' के लिए। इसका मतलब है कि स्ट्रिंग '\\ ????' 'के रूप में सामने आएगी, इसलिए' '' बच निकला, यह '" \ ???? "' बन जाता है। मुझे नहीं पता कि स्ट्रिंग अक्षर के अंदर ट्रिगर को प्रतिस्थापित किया गया है, हालांकि यह सब गलत हो सकता है। इसे स्पॉट करने के लिए +1। –

+2

ट्रिग्राफ के लिए देखना होगा, क्योंकि "wtf ??!" ''Wtf |' 'में बदल जाएगा।' यह कुंजीपटल के एक पुराने युग से पुराना निर्माण है जो कुछ चाबियाँ खो रहा था। –

+0

@Chris तो फिर उन्हें स्ट्रिंग अक्षर के अंदर बदल दिया गया है? –

4

हो सकता है दूर करने के लिए शाब्दिक जब परिवर्तन संकलक विकल्प है कि हल करने के लिए एक उचित तरीका होना चाहिए।

एक उदाहरण:

आप इस तरह की कुछ प्रोटोटाइप के साथ एक API है:

void Display (unsigned char * Text); 

और आप इस तरह फोन हैं:

Display ("Some text"); 

आप ही चेतावनी मिल सकता है ("प्रदर्शन 'के तर्क 1 को पारित करने में सूचक लक्ष्य हस्ताक्षर में भिन्न होते हैं")।

यह चेतावनी झंडा -Wpointer-sign कि, जीएनयू संकलक संदर्भ के हवाले से "... -Wall द्वारा और -pedantic द्वारा निहित है, जो -Wno-pointer-sign साथ निष्क्रिय किया जा सकता" कारण है।

संबंधित मुद्दे