2016-02-01 9 views
22

क्या करता है ((संरचना का नाम *) 0) -> सदस्य) सी में करते हैं? struct name सूचक कोक्या करता है ((संरचना का नाम *) 0) -> सदस्य) सी में करते हैं?

(char *) &((struct name *)0)->member) 
+3

[तो] (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

+1

और इसके (अपरिभाषित) व्यवहार: https://stackoverflow.com/questions/26906621/does-struct-name-null-b-cause-undefined-behaviour-in-c11 – 2501

+0

मैं वास्तव में ऑफ़सेट के बारे में नहीं जानना चाहता() यहाँ। मुझे विशेष रूप से यह बताने में दिलचस्पी है कि दिए गए कथन कैसे काम करते हैं। यह एक डुप्लिकेट IMHO – krisharav

उत्तर

25

struct के ऑफसेट को member नामक ऑफसेट प्राप्त करने के लिए यह एक चाल है। इस दृष्टिकोण के पीछे विचार यह है कि संकलक member के पते की गणना करने के लिए यह मानते हुए कि संरचना स्वयं पते शून्य पर स्थित है।

offsetof का उपयोग करते हुए इस वाक्य रचना करने के लिए एक अधिक पठनीय विकल्प प्रदान करता है:

size_t offset = offsetof(struct name, member); 
+0

अच्छा! विकी पेज के लिए पॉइंटर के लिए भी धन्यवाद। जो Google पर दिखाई नहीं दिया :) – krisharav

+1

लेकिन क्या यह एक शून्य सूचक को कम करने के लिए अपरिभाषित व्यवहार नहीं है? –

+3

आप इसे वास्तव में संदर्भित नहीं कर रहे हैं। केवल जोड़ों को प्राप्त करना। – krisharav

5

(struct name *)00 कास्टिंग है:

वास्तविक सी बयान मैं भर में आया था इस था।
&((struct name *)0)->member) सदस्य member का पता प्राप्त कर रहा है।
(char *) &((struct name *)0)->member) उस पते को char * पर कास्ट कर रहा है।

यदि कोई सोचता है कि उपर्युक्त अभिव्यक्ति NULL पॉइंटर को संदर्भित कर रही है, तो ध्यान दें कि यहां कोई डेरफ़्रेंसिंग नहीं है। सदस्य number का पता प्राप्त करने के लिए यह सब कुछ है।

+0

'(संरचना का नाम *) 0' 'संरचना नाम + 0' जैसा ही है? –

+2

@CoolGuy - नहीं, क्योंकि '& struct name' कानूनी सी नहीं है क्योंकि आप किसी प्रकार का पता नहीं ले सकते हैं। – LThode

+0

किसी भी कानूनी के लिए '0' कास्टिंग कैसे किया जा रहा है? '0' एक पूर्णांक नहीं है, ठीक है? आप बस यादृच्छिक संरचना पॉइंटर्स के लिए '0' या '7' या'' \ n '' डाल सकते हैं? – user1717828

5

(struct name*)0 आप एक struct सूचक देता है।

((struct name*)0)->member आपको उस संरचना का सदस्य देता है जहां सूचक इंगित करता है।

& जोड़ने से आप उस सदस्य का पता देता है, और अंत में

(char *) एक चार सूचक को प्राप्त पता कास्ट करने के लिए है।

1

कई compilers पर, ऊपर अभिव्यक्ति एक char* निकलेगा जो है, जबकि यह एक वैध सूचक नहीं है, एक एक या दोनों निम्नलिखित गुण की है:

  1. सूचक सीधे कास्टिंग एक पूर्णांक के लिए प्रकार संरचना के भीतर संकेतित सदस्य के विस्थापन पैदा करेगा।

  2. पॉइंटर से (char*)0 घटाकर संरचना के भीतर संकेतित सदस्य का विस्थापन होगा।

ध्यान दें कि सी स्टैंडर्ड अगर कोड ऊपर साधन या किसी अन्य के माध्यम से गलत सूचक मूल्य रूपों, भले ही कोड संकेतक भिन्नता के लिए कोई प्रयास करता है क्या हो सकता है के संबंध में कोई आवश्यकताओं लगाता है। जबकि कई कंपाइलर संकेतक के साथ पॉइंटर्स उत्पन्न करते हैं, ऐसे व्यवहार सार्वभौमिक नहीं हैं। यहां तक ​​कि प्लेटफार्मों पर भी जहां पॉइंटर्स और पूर्णांक के बीच एक स्पष्ट प्राकृतिक संबंध मौजूद है, कुछ संकलक विक्रेता निर्णय ले सकते हैं कि इस तरह के रिश्ते से जुड़े कार्यक्रमों का व्यवहार करने के लिए, यह अधिक कुशल "होगा" इसके बजाय संकलक यह मानने के लिए कि एक कार्यक्रम कभी नहीं होगा ऐसे इनपुट प्राप्त करें जो अमान्य पॉइंटर्स की पीढ़ी का कारण बनें और इसके परिणामस्वरूप, कोई भी कोड जो केवल तभी प्रासंगिक होगा यदि इस तरह के इनपुट प्राप्त किए गए हों।

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