क्या करता है ((संरचना का नाम *) 0) -> सदस्य) सी में करते हैं? struct name
सूचक कोक्या करता है ((संरचना का नाम *) 0) -> सदस्य) सी में करते हैं?
(char *) &((struct name *)0)->member)
क्या करता है ((संरचना का नाम *) 0) -> सदस्य) सी में करते हैं? struct name
सूचक कोक्या करता है ((संरचना का नाम *) 0) -> सदस्य) सी में करते हैं?
(char *) &((struct name *)0)->member)
struct
के ऑफसेट को member
नामक ऑफसेट प्राप्त करने के लिए यह एक चाल है। इस दृष्टिकोण के पीछे विचार यह है कि संकलक member
के पते की गणना करने के लिए यह मानते हुए कि संरचना स्वयं पते शून्य पर स्थित है।
offsetof
का उपयोग करते हुए इस वाक्य रचना करने के लिए एक अधिक पठनीय विकल्प प्रदान करता है:
size_t offset = offsetof(struct name, member);
(struct name *)0
0
कास्टिंग है:
वास्तविक सी बयान मैं भर में आया था इस था।
&((struct name *)0)->member)
सदस्य member
का पता प्राप्त कर रहा है।
(char *) &((struct name *)0)->member)
उस पते को char *
पर कास्ट कर रहा है।
यदि कोई सोचता है कि उपर्युक्त अभिव्यक्ति NULL
पॉइंटर को संदर्भित कर रही है, तो ध्यान दें कि यहां कोई डेरफ़्रेंसिंग नहीं है। सदस्य number
का पता प्राप्त करने के लिए यह सब कुछ है।
'(संरचना का नाम *) 0' 'संरचना नाम + 0' जैसा ही है? –
@CoolGuy - नहीं, क्योंकि '& struct name' कानूनी सी नहीं है क्योंकि आप किसी प्रकार का पता नहीं ले सकते हैं। – LThode
किसी भी कानूनी के लिए '0' कास्टिंग कैसे किया जा रहा है? '0' एक पूर्णांक नहीं है, ठीक है? आप बस यादृच्छिक संरचना पॉइंटर्स के लिए '0' या '7' या'' \ n '' डाल सकते हैं? – user1717828
(struct name*)0
आप एक struct सूचक देता है।
((struct name*)0)->member
आपको उस संरचना का सदस्य देता है जहां सूचक इंगित करता है।
&
जोड़ने से आप उस सदस्य का पता देता है, और अंत में
(char *)
एक चार सूचक को प्राप्त पता कास्ट करने के लिए है।
कई compilers पर, ऊपर अभिव्यक्ति एक char*
निकलेगा जो है, जबकि यह एक वैध सूचक नहीं है, एक एक या दोनों निम्नलिखित गुण की है:
सूचक सीधे कास्टिंग एक पूर्णांक के लिए प्रकार संरचना के भीतर संकेतित सदस्य के विस्थापन पैदा करेगा।
पॉइंटर से (char*)0
घटाकर संरचना के भीतर संकेतित सदस्य का विस्थापन होगा।
ध्यान दें कि सी स्टैंडर्ड अगर कोड ऊपर साधन या किसी अन्य के माध्यम से गलत सूचक मूल्य रूपों, भले ही कोड संकेतक भिन्नता के लिए कोई प्रयास करता है क्या हो सकता है के संबंध में कोई आवश्यकताओं लगाता है। जबकि कई कंपाइलर संकेतक के साथ पॉइंटर्स उत्पन्न करते हैं, ऐसे व्यवहार सार्वभौमिक नहीं हैं। यहां तक कि प्लेटफार्मों पर भी जहां पॉइंटर्स और पूर्णांक के बीच एक स्पष्ट प्राकृतिक संबंध मौजूद है, कुछ संकलक विक्रेता निर्णय ले सकते हैं कि इस तरह के रिश्ते से जुड़े कार्यक्रमों का व्यवहार करने के लिए, यह अधिक कुशल "होगा" इसके बजाय संकलक यह मानने के लिए कि एक कार्यक्रम कभी नहीं होगा ऐसे इनपुट प्राप्त करें जो अमान्य पॉइंटर्स की पीढ़ी का कारण बनें और इसके परिणामस्वरूप, कोई भी कोड जो केवल तभी प्रासंगिक होगा यदि इस तरह के इनपुट प्राप्त किए गए हों।
[तो] (https://stackoverflow.com/questions/7180290/how-do-you-use-offsetof-on-a-struct), [कई] (https: // stackoverflow।कॉम/प्रश्न/713963/क्यों-यह-कार्यान्वयन-ऑफ-ऑफ़सेट-काम), [डुप्लिकेट] (https://stackoverflow.com/questions/6700114/portability-of-using-stddef-hs-offsetof-rather -थान-रोलिंग-अपना खुद का)। – 2501
और इसके (अपरिभाषित) व्यवहार: https://stackoverflow.com/questions/26906621/does-struct-name-null-b-cause-undefined-behaviour-in-c11 – 2501
मैं वास्तव में ऑफ़सेट के बारे में नहीं जानना चाहता() यहाँ। मुझे विशेष रूप से यह बताने में दिलचस्पी है कि दिए गए कथन कैसे काम करते हैं। यह एक डुप्लिकेट IMHO – krisharav