2011-09-01 15 views
5

इस कोड:शून्य * सूचक में समस्या का संदर्भ?

int p = 10; 
void *q; 
*q = 10; 

संकलन नहीं करता:

'=': 'int' से करने के लिए 'शून्य *'

हालांकि, इस कोड ठीक संकलित परिवर्तित नहीं कर सकते:

int p = 10; 
void *q; 
q = &p; 

इसके पीछे क्या कारण है?

+0

त्रुटि। क्या त्रुटि है? (इस मामले में, यह थोड़ा स्पष्ट है, लेकिन आपको हमेशा त्रुटि पोस्ट करनी चाहिए।) –

+0

'=': 'int' से 'void *' में परिवर्तित नहीं हो सकता है – teacher

+0

आपका कंपाइलर अजीब है ... यह कन्वर्ट करना चाहता है 'int'' void * 'कथन दिया गया * * q = 10;'? ??? उस कथन में, '10' में 'int' टाइप किया गया है और' * q' में टाइप 'void' है। – pmg

उत्तर

5

एक void * अंक के लिए किसी भी स्मृति पता असाइन कर सकते हैं अगर यह आरंभ नहीं हो जाता है, जो तुम्हारा नहीं है)।

आप केवल ज्ञात प्रकार के चर या किसी ज्ञात प्रकार के पॉइंटर्स के माध्यम से असाइन कर सकते हैं।

int p = 10; 
void *q = &p; 

*(int *)q = 20; 

if (p != 20) 
    ...something has gone horribly wrong... 

यह एक int * में void * धर्मान्तरित और फिर उस dereferenced पूर्णांक सूचक के लिए एक मूल्य प्रदान करती है।

4

किसी भी सूचक को void* में परिवर्तित किया जा सकता है, लेकिन void पर एक सूचक को हटाना गैरकानूनी है।

+3

नरक हाँ, आप ऐसा कुछ नहीं लिख सकते जो कुछ भी इंगित न करे। – kenny

1

पहला स्निपेट अपरिभाषित व्यवहार है।

0

आप शून्य सूचक को अस्वीकार नहीं कर सकते हैं। और यहां तक ​​कि यदि आप कर सकते हैं, तो आपका कोड कुछ यादृच्छिक स्मृति पते और शायद क्रैश पर लिख रहा होगा।

दूसरा कोड ब्लॉक आप सूचक जो ठीक काम करता है के पते बताए जाते हैं जब से तुम (एक अज्ञात प्रकार के डेटा के लिए एक void*

1

कोड के दो टुकड़े (कोशिश करें) अलग-अलग चीजें करते हैं।

पहला व्यक्ति ऑब्जेक्ट q अंक पर मान 10 असाइन करने का प्रयास कर रहा है। यहां पर दो समस्याएं हैं। सबसे पहले आपने पॉइंटर को कभी शुरू नहीं किया। इससे पहले कि आप इसे इंगित करने के मूल्य को बदल सकें, इससे पहले कि आप इसे कहीं भी इंगित करें। और दूसरा, आप void* को अस्वीकार नहीं कर सकते क्योंकि प्रकार ज्ञात नहीं है।

कोड का दूसरा भाग परिवर्तनीय p से q का पता निर्दिष्ट कर रहा है। इस q के बाद p में संग्रहीत ऑब्जेक्ट को इंगित करेगा।

1

यह करने के लिए स्मृति में पता बदलता है q अंक:

q = &p; 

यह (int, long, std::string, int**, आदि) के लिए क्या q अंक के प्रकार को समझ नहीं सकता;

*q = 10; 

आप कर सकता है:: यह सब जानता है स्मृति में स्थान है

int *iq = static_cast<int*>(q); 
*iq = 10; 

आप void*s के बारे में और अधिक पढ़ सकते हैं।

2

शून्य * यह नहीं जानता कि यह कितना हो रहा है और यह क्या हो रहा है?

ताकि आप किसी भी सूचक प्रकार को असाइन कर सकें क्योंकि इसमें कोई आकार हो सकता है! लेकिन एक मूल्य असाइन नहीं कर सकता क्योंकि यह नहीं जानता कि उसे स्टोर करना है ...!

0

आपके सूचक q किसी भी स्मृति स्थान को इंगित नहीं करता है। इसलिए आप इसे मूल्य असाइन नहीं कर सकते हैं।

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