आधिकारिक या अन्यथा किसी की परवाह किए बिना, यह अपरिभाषित व्यवहार नहीं है , क्योंकि यह मानक द्वारा परिभाषित किया गया है। p->s
को छोड़कर, जब एक लवल्यू के रूप में उपयोग किया जाता है, एक समान सूचक का मूल्यांकन करता है (char *)p + offsetof(struct T, s)
। विशेष रूप से, यह char
मॉलोकॉल्ड ऑब्जेक्ट के अंदर एक वैध सूचक है, और इसके तुरंत बाद 100 (या अधिक संरेखण पर निर्भरता) क्रमिक पते हैं जो char
आवंटित ऑब्जेक्ट के अंदर ऑब्जेक्ट के रूप में भी मान्य हैं । तथ्य यह है कि सूचक ->
द्वारा malloc
डाली गई सूचक को ऑफसेट को स्पष्ट रूप से जोड़ने के बजाय का उपयोग करके व्युत्पन्न किया गया था , को डाला गया है char *
, अप्रासंगिक है।
तकनीकी रूप से, संरचना के अंदर सरणी p->s[0]
का एकल तत्व है char
, अगले कुछ तत्व (जैसे के p->s[1]
माध्यम से p->s[3]
) संरचना के अंदर संभावित पैडिंग बाइट्स होते हैं, जो कि भ्रष्ट हो सकते हैं यदि आप समग्र रूप से संरचना को असाइन करते हैं, लेकिन यदि आप केवल व्यक्तिगत रूप से एक्सेस नहीं करते हैं, तो सदस्य, और बाकी तत्व आवंटित ऑब्जेक्ट में अतिरिक्त स्थान हैं जो आप वैसे भी उपयोग करने के लिए स्वतंत्र हैं, जब तक आप संरेखण आवश्यकताओं का पालन करते हैं (और char
कोई संरेखण आवश्यकताएं नहीं हैं)।
आप चिंतित हैं कि गद्दी के साथ अतिव्यापी की संभावना struct में बाइट्स किसी भी तरह नाक राक्षसों आह्वान, आप बदल कर भी इस से बच सकते हैं सकता है 1
में [1]
जो यह सुनिश्चित करता है struct के अंत में कोई गद्दी है कि वहाँ एक मूल्य के साथ। ऐसा करने का एक सरल लेकिन व्यर्थ तरीका यह होगा कि अंत में बिना किसी सरणी को छोड़कर समान सदस्यों के साथ एक संरचना बनाई जाए और s[sizeof struct that_other_struct];
सरणी के लिए उपयोग किया जाए। फिर, p->s[i]
स्पष्ट रूप से संरचना में सरणी के एक तत्व के i<sizeof struct that_other_struct
रूप में और के लिए संरचना के अंत के बाद एक पते पर एक चार ऑब्जेक्ट के रूप में परिभाषित किया गया है i>=sizeof struct that_other_struct
।
संपादित करें: वास्तव में, सही आकार प्राप्त करने के लिए उपरोक्त ट्रिक में, आपको सरणी से पहले प्रत्येक सरल प्रकार से युक्त एक संघ भी रखना पड़ सकता है, यह सुनिश्चित करने के लिए कि सरणी स्वयं किसी अन्य तत्व के पैडिंग के बजाय अधिकतम संरेखण के साथ शुरू होती है। । फिर से, मुझे विश्वास नहीं है कि इसमें से कोई भी आवश्यक है, लेकिन मैं इसे भाषा-वकीलों के सबसे अधिक विरोधाभास के लिए पेश कर रहा हूं।
संपादित करें 2: पैडिंग बाइट्स के साथ ओवरलैप निश्चित रूप से एक मुद्दा नहीं है, मानक के एक और हिस्से के कारण। C के लिए आवश्यक है कि यदि दो संरचनाएं अपने तत्वों की प्रारंभिक अनुगामी में सहमत हों, तो सामान्य प्रारंभिक तत्वों को एक पॉइंटर के माध्यम से या तो टाइप किया जा सकता है। एक परिणाम के रूप में, अगर एक struct के समान struct T
है, लेकिन एक बड़ा अंतिम सरणी के साथ घोषित किया गया, तत्व s[0]
तत्व के साथ मेल खाना करने के लिए होता s[0]
में struct T
, और इन अतिरिक्त तत्वों की उपस्थिति को प्रभावित नहीं कर सकता है या बड़ा struct के आम तत्व तक पहुँचने से प्रभावित हो करने के लिए एक सूचक का उपयोग कर struct T
।