के साथ बहुत अधिक विषय नहीं जा रहा हूं, मुझे पता है कि यह एक पुराना सवाल है, लेकिन मेरे विचार में और कहा जा सकता है और कुछ अन्य उत्तरों गलत हैं।
सबसे पहले, यह डाली:
(struct Base *)ptr
... अनुमति दी है, लेकिन केवल तभी संरेखण की जरूरतें पूरी नहीं कर रहे हैं। कई कंपाइलरों पर आपके दो संरचनाओं में समान संरेखण आवश्यकताएं होंगी, और किसी भी मामले में इसे सत्यापित करना आसान है। यदि आप इस बाधा को दूर करते हैं, तो अगला यह है कि कास्ट का नतीजा ज्यादातर अनिर्दिष्ट है - यानी, सी मानक में कोई आवश्यकता नहीं है कि पॉइंटर एक बार फिर भी उसी वस्तु को संदर्भित करता है (केवल के बाद इसे पर कास्टिंग मूल प्रकार यह आवश्यक रूप से ऐसा करेगा)।
हालांकि, व्यावहारिक रूप से, सामान्य प्रणालियों के लिए कंपाइलर आमतौर पर एक पॉइंटर कास्ट का परिणाम उसी ऑब्जेक्ट को संदर्भित करते हैं।
(पॉइंटर कास्ट सी 99 मानक और हाल ही में सी 11 मानक दोनों के खंड 6.3.2.3 में शामिल हैं। नियमों में अनिवार्य रूप से दोनों ही हैं, मुझे विश्वास है)।
अंत में, आपको "सी 99/सी 11 6.5 अनुच्छेद 7) के साथ संघर्ष करने के लिए तथाकथित" सख्त एलियासिंग "नियम मिल गए हैं; मूल रूप से, आपको किसी अन्य प्रकार के पॉइंटर के माध्यम से एक प्रकार की ऑब्जेक्ट तक पहुंचने की अनुमति नहीं है (कुछ अपवादों के साथ, जो आपके उदाहरण में लागू नहीं होते हैं)। "What is the strict-aliasing rule?" देखें, या बहुत गहन चर्चा के लिए, इस विषय पर मेरे blog post पढ़ें।
निष्कर्ष में, आप अपने कोड में जो प्रयास करते हैं, वह काम करने की गारंटी नहीं देता है। यह हमेशा कुछ कंपाइलरों (और कुछ कंपाइलर विकल्पों के साथ) के साथ काम करने की गारंटी दी जा सकती है, और यह कई कंपाइलरों के साथ मौका दे सकता है, लेकिन यह निश्चित रूप से सी भाषा मानक के अनुसार अपरिभाषित व्यवहार का आह्वान करता है।
*((int *)ptr) = 1;
... अर्थात:
यह क्या आप बजाय कर सकता है चूंकि आप जानते हैं कि संरचना का पहला सदस्य int
है, तो आप सीधे int
पर डालें, जो एलियासिंग समस्या को छोड़ देता है क्योंकि दोनों प्रकार की संरचना वास्तव में इस पते पर int
होती है। आप उस संरचना लेआउट को जानने पर भरोसा कर रहे हैं जो संकलक का उपयोग करेगा और आप अभी भी पॉइंटर कास्टिंग के गैर-मानक अर्थशास्त्र पर भरोसा कर रहे हैं, लेकिन व्यावहारिक रूप से यह आपको समस्याएं कम करने की संभावना कम है।
क्या आपने इसे आजमाया? क्या हुआ ? –
यह संकलक शिकायत के बिना काम करता है, लेकिन मैं जानना चाहता हूं कि यह एक सामान्य उपयोग योग्य अभ्यास है, या कुछ बुरा हैक (यह अभी मुझे एक टन में मदद करेगा)। – Anon
@PaulR यदि आपका प्रश्न "पूछने के बजाय स्वयं को आज़माएं" कहने के लिए है, तो आपको अनिर्धारित व्यवहार के बारे में जानना चाहिए और यह आज आपके प्रयोग को सही कैसे दिख सकता है लेकिन कल विफल हो सकता है - और उपाध्यक्ष। – hmijail