2013-01-13 12 views
6

मैं एक संघ के साथ एक struct के लिए सूचक मिल गया हैनकल

तो चलो कहते हैं कि हम

struct A { 
    union { 
    char **word; 
    struct A *B 
    } u; 
}; 

है और मैं चर x और ग्रुप ए के y डालते हैं *

typedef A* A_t; 
A_t x; 
A_t y; 

x-> u = y-> आप संघ में सामानों की प्रतिलिपि बनाने के लिए पर्याप्त होंगे।

+3

यही बयान पक्का segfault का कारण होगा! –

+0

बीटीडब्ल्यू: 'टाइपपीफ ए * ए_टी; 'सी में एक वाक्यविन्यास त्रुटि है क्या आप सी ++ कंपाइलर का उपयोग कर रहे हैं? बीटीडब्ल्यू 2: टाइपिफ़िंग पॉइंटर्स को एक बुरी आदत माना जाना चाहिए। – wildplasser

उत्तर

4

यदि आप किसी भी चीज़ को मान्य नहीं कर रहे हैं तो आप केवल उन्मूलन पॉइंटर्स नहीं कर सकते हैं।
x->u करने में सक्षम होने के लिए आपको x कुछ मान्य मेमोरी के लिए सुनिश्चित करना होगा, जो कोड आप दिखाते हैं वह एक अनियंत्रित सूचक है जो अनिर्धारित व्यवहार का कारण बनता है और सबसे अधिक संभावना है। y->u के लिए भी लागू होता है। तो सुनिश्चित करें कि x और y उन्हें खराब करने से पहले मान्य स्मृति को इंगित करें।

x->u = y->u 

एक गहरी प्रतिलिपि लेकिन एक उथले प्रतिलिपि प्रदर्शन नहीं करेंगे।
आप मूल रूप से उसी स्मृति को इंगित करने वाले दो पॉइंटर्स के साथ समाप्त हो जाएंगे, जो शायद आप चाहते हैं या आवश्यकता नहीं है।

यदि आपको एक गहरी प्रतिलिपि की आवश्यकता है, तो आपको उस डेटा को कॉपी करने के लिए अपने गंतव्य को पर्याप्त मेमोरी आवंटित करनी चाहिए और उसके बाद स्रोत संघ की सामग्री की प्रतिलिपि बनाने के लिए memcpy का उपयोग करें।

अच्छा पढ़ें:
What is the difference between a deep copy and a shallow copy?

+1

वह पहले एक्स को इंगित करने के लिए एक्स और वाई के लिए कुछ जगह आवंटित करेगा। –

+0

@CarlNorum: हम्म, संभोग, मुझे लगता है कि ओपी ऐसा करेगा। वैसे भी जब आप इसे लाएंगे तो मैं इसके बारे में एक नोट जोड़ूंगा। –

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