c++ - assign `this` to `MyClass *instance`, `instance->member` is not referencing same memory as `this->member` -


मेरे सीपीपी कार्यान्वयन में मेरे पास है:

  स्थिर MyClass * उदाहरण;  

सभी युक्त स्कोप (घुंघराले {}) के बाहर आज़ादी से चलती है मैंने इसे nullptr करने के लिए भी आरंभ करने की कोशिश की है।

  शून्य MyClass :: myMethod () {instance = this; लॉग ("हैलो,% d,% d", wList, उदाहरण-> डब्लूएलआईएस);  

उपरोक्त लॉग सदस्य ऑब्जेक्ट पॉइंटर wList के लिए एक मनमाना स्थान दिखाता है, लेकिन उदाहरण उसी डेटा की ओर इशारा कर देना चाहिए जो कि यह करता है, और इसलिए वही wList , लेकिन यह नहीं है example-> wList अभी भी 0 है। यहां क्या हो रहा है?

के रूप में मार्क रोटोम ने टिप्पणी में नोट किया, आप एक संकेतक को प्रिंट करने के लिए % d फ़ॉर्मेट स्पेसिजर का उपयोग नहीं कर सकते हैं, आपको अपने कोड को पोर्टेबल होने के लिए % p का उपयोग करना होगा पॉइंटर्स के लिए % p के अलावा कुछ भी उपयोग करने के लिए तकनीकी रूप से अपरिभाषित व्यवहार है, लेकिन सभी संभावनाओं में आप देखेंगे कि यह 32-बिट सिस्टम पर ठीक काम करेगा।

हालांकि, 64-बिट सिस्टम पर, जिस पर मैं दांव लगाता हूं आप का उपयोग कर रहे हैं, यह ऊपर चल रही है संकेतक 8 बाइट्स हैं, लेकिन printf स्टैक के 4 बाइट्स को पढ़ने की कोशिश करता है, जब यह % d को देखता है दूसरा % d स्पेसिफायर के लिए, यह अगले 4 बाइट्स को पढ़ता है, जो सूचक के अन्य 4 बाइट्स हैं- यदि आप उस के लिए 0 देख रहे हैं, तो शायद इसका अर्थ है कि आपका पॉइंटर एक छोटे-एंडियन सिस्टम पर पहले 4 जीबी की मेमोरी (यानी इसका मान कुछ 0x00000000'xxxxxxxx जैसा था)। printf के पास दूसरे पॉइंटर से स्टैक पर 8 बाइट्स कभी भी नहीं पढ़ा जाता।

% p स्पेसिफिकर पोर्टेबल सभी प्लेटफॉर्म्स पर एक संकेतक छापता है, चाहे वे 32 बिट, 64 बिट, या किसी अन्य आकार के हों। इसका एक दुर्भाग्यपूर्ण परिणाम यह है कि सटीक आउटपुट प्रारूप कार्यान्वयन-परिभाषित है, जिसका अर्थ है कि यह सिस्टम के बीच में परिवर्तन कर सकता है और करता है। कुछ सिस्टम एक अग्रणी 0x या 0x का उपयोग कर सकते हैं, जबकि अन्य में कोई भी उपसर्ग नहीं हो सकता है और केवल कच्चे हेक्स मूल्य को प्रिंट कर सकते हैं कुछ लोगों को 0 के साथ बाएं पैड हो सकता है, और अन्य शायद नहीं।

यदि आप सटीक आउटपुट को नियंत्रित करना चाहते हैं, तो आप अपनी पसंद के प्रारूप का उपयोग कर सकते हैं (जैसे % 08x या % 016llx ) जब तक आप उस विनिर्देशक के लिए उचित सूचक डालते हैं उदाहरण के लिए, यहां बताया गया है कि 32- और 64-बिट सिस्टमों पर आप कैसे करेंगे:

  printf ("0x% 08x \ n", (अहस्ताक्षरित int) (uintptr_t) myPointer); // 32-बिट प्रिंटफ़ ("0x% 016llx \ n", (अहस्ताक्षरित लंबे समय तक) (uintptr_t) myPointer); दो बार कास्टिंग करने का कारण नकली संकलक चेतावनियों से बचने का कारण है, क्योंकि कुछ कंपलर शिकायत करेंगे कि यदि आप एक सूचक प्रकार से एक पूर्णांक प्रकार में डालेंगे जो कि इसकी गारंटी नहीं है एक सूचक रखने के लिए पर्याप्त रूप से बड़ा हो। 


Comments

Popular posts from this blog

java - org.apache.http.ProtocolException: Target host is not specified -

java - Gradle dependencies: compile project by relative path -

ruby on rails - Object doesn't support #inspect when used with .include -