सी

2012-12-06 1 views
6
में एक स्थिरांक हस्ताक्षर के साथ एक बुरा कॉल

संभव डुप्लिकेट:
why isnt it legal to convert (pointer to pointer to non-const) to a (pointer to pointer to a const)सी

मैं एक चेतावनी (जीसीसी 42.2) foo के निम्नलिखित कॉल के साथ क्यों मिलता है?

void foo(const char **str) 
{ 
    (*str)++; 
} 

(...) 
char **str; 
foo(str); 
(...) 

मैं समझता हूँ कि हम क्यों एक समारोह है कि एक const char ** के साथ एक char ** छोड़कर कॉल नहीं कर सकते, लेकिन विपरीत मेरे लिए ठीक लगता है, तो क्यों निम्न चेतावनी?

warning: passing argument 1 of 'foo' from incompatible pointer type 
+4

चेतावनी क्या है? –

+0

क्षमा करें, अभी इसे – Guid

+0

जोड़ा गया है जो आप संकलन टैग का उपयोग कर रहे हैं? –

उत्तर

8

यह गलत है। यहां कंपाइलर के साथ बहस करने के लिए कोई वास्तविक कमरा नहीं है, क्योंकि यह spec द्वारा समर्थित है।

void func(const char **p) 
{ 
    *p = "abc"; 
} 

void func2(void) 
{ 
    char *a; 
    func(&a); 
    *a = 'x'; 
} 

संकलक एक त्रुटि थूक से बाहर नहीं किया, तो अपने कार्यक्रम शायद क्रैश हो सकता है क्योंकि आप एक स्ट्रिंग शाब्दिक (जो अक्सर पढ़ा चिह्नित है अधिलेखन होगी: यहाँ एक उदाहरण जो बताते हैं वास्तव में क्यों यह गलत है है केवल स्मृति में)।

तो तुम परोक्ष const char ** को char ** डाली नहीं कर सकता क्योंकि यह आपको किसी भी मूल्य से const क्वालीफायर को दूर करने की अनुमति होगी - मूल रूप से, यह आप एक स्पष्ट कलाकारों के बिना होगा पर const की अनदेखी करने की अनुमति होगी।

कंपेलर त्रुटि की बजाय चेतावनी देता है इसका मुख्य कारण यह है कि बहुत से पुराने कोड const क्वालीफायर का उपयोग नहीं करते हैं, जहां कोड आज लिखा गया था।