2011-08-16 17 views
5

मैं हो रही है का उपयोग कर इसे मुक्त कराने के बाद एक सूचक का उपयोग करना:कोड निम्न प्रकार के साथ मुक्त() समस्याओं

int* myPointer1 = malloc(50 * sizeof(int)); 
int* myPointer2 = malloc(50 * sizeof(int)); 
free(myPointer1); 
myPointer1 = myPointer2; 
myPointer1[0] = 3; 

मैं एक विभाजन गलती हो रही है। समस्या क्या है?

+5

क्या आपने यह सुनिश्चित करने के लिए जांच की है कि मॉलोक ऑपरेशंस सफल रहे? यदि आप नहीं करते हैं तो आप myPointer1 को NULL को असाइन कर सकते हैं। – djhaskin987

+0

आप कहां सेगफॉल्ट करते हैं? 'फ्री (myPointer1)' पर या 'myPointer1 [0] = 3' पर? – Seth

+0

यदि 'malloc' सफल होता है तो कोई segfault नहीं होना चाहिए। आप जो कुछ कर रहे हैं वह स्मृति को 'myPointer1' के मूल स्मृति स्थान पर मुक्त कर रहा है, फिर' myPointer1' 'को' myPointer2' 'के स्थान पर पुन: असाइन कर रहा है। नोट, हालांकि, अगर आप उस आखिरी बिट मेमोरी को मुक्त करने जा रहे हैं, तो आप केवल एक ही पॉइंटर्स (यानी 'myPointer1' या' myPointer2') को मुक्त करना चाहते हैं क्योंकि वे एक ही पते पर इंगित करते हैं। – RageD

उत्तर

3

समस्या इस कोड में नहीं है। आपके द्वारा पोस्ट किया गया स्निपेट सही प्रतीत होता है, और अलगाव में ठीक काम करता है।

+0

कोड स्निपेट सही है क्योंकि यह सही है, यह सही नहीं है क्योंकि यह काम करता है, यह यूबी के साथ भी बहुत अच्छा काम कर सकता है और उस समय तक उड़ सकता है जब कम से कम इसकी अपेक्षा होती है। –

+2

"कोड स्निपेट सही है क्योंकि यह सही है" -> http://xkcd.com/703/ =) – jadarnel27

+2

मैंने यह नहीं कहा कि यह सही था क्योंकि यह काम करता था - मैंने कहा कि यह सही साबित हुआ (उदाहरण के लिए, इसमें कोई स्पष्ट अपरिभाषित व्यवहार नहीं है), * और * यह काम करता है (उदाहरण के लिए, मुझे सेगमेंटेशन गलती एज़फेयर रिपोर्ट नहीं मिली है)। – duskwuff

2

आपका कोड सही है, इसमें कुछ भी गलत नहीं है, लेकिन आप malloc() फ़ंक्शन के रिटर्न वैल्यू का परीक्षण करने की आदत बनाते हैं, यदि यह नल है तो यह आपके प्रोग्राम में समस्या पैदा करेगा, हमारे मामले में स्मृति आवंटन malloc() फ़ंक्शन असफल रहा है

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