2011-03-21 10 views
5

समझौता अवधारणा निम्नलिखित कोड की कोशिश की:से मुक्त

#include<stdio.h> 
int main() 
{   
     int *p,*q; 
     p = (int *)malloc(sizeof(int)); 
     *p =10; 
     q = p; 
     printf("%u \n",p); 
     printf("%u \n",q); 
     free(p); 
     printf("%u \n",p); 
     return 0; 
} 

उत्पादन मिल गया इस प्रकार है:

[[email protected] Tazim]# ./a.out 
154804232 
154804232 
154804232 

क्यों पी के अंदर उस पते पर भी मैं free(p); किया है मुद्रित है? क्या free(p) है तो क्या किया?

मैं स्पष्ट/मॉलोक की अवधारणा को स्पष्ट रूप से समझना चाहता हूं। कोई मदद मूल्यवान होगा।

उत्तर

5

free() केवल ढेर पर स्मृति को मुक्त करता है। यह आपके सूचक का मूल्य नहीं बदलता है। यदि आपने अपने सूचक द्वारा इंगित स्मृति को मुद्रित करने का प्रयास किया है, तो आप शायद किसी प्रकार का कचरा प्राप्त करेंगे।

इसके अलावा, जब आप free कहा जाता है, आप इसे सूचक नहीं, बल्कि आपके सूचक को भाषण दिया है, तो free अपने सूचक को बदल सकते हैं नहीं ...

+0

यह सच है, लेकिन सूचक मूल्य मुद्रित करना अभी भी अपरिभाषित व्यवहार है - http://stackoverflow.com/q/4076563/57428 – sharptooth

+0

@sharptooth - धन्यवाद। पता नहीं था कि – MByD

3

अपरिभाषित व्यवहार है कि - एक बार आप free घ है सूचक पता संग्रहीत अमान्य हो जाता है और आप can't do anything with it - न केवल आप कर सकते हैं भिन्नता यह है, लेकिन आप भी नहीं printf() सूचक मूल्य नहीं कर सकते हैं।

+0

यह तकनीकी रूप से प्रश्न का उत्तर नहीं देता है। –

+0

@ बस मेरा सही विकल्प: यह करता है - एक बार जब आप 'मुक्त()' कर लेते हैं तो आप पता मुद्रित नहीं कर सकते - यह किसी भी परिणाम का उत्पादन कर सकता है। – sharptooth

+0

सवाल यह था कि "पी के अंदर का पता अभी भी मुद्रित है, भले ही मैंने मुफ्त (पी) किया हो; मुक्त (पी) क्या किया गया है? मुक्त/मॉलोक की अवधारणा को स्पष्ट रूप से समझना चाहते हैं।" आपने इसका कोई भी जवाब नहीं दिया। –

2

आप संकेत प्रिंट कर रहे हैं, का पता यानी आपके लिए इन्सटेटेड मेमोरी जोन। free के साथ मेमोरी जोन को फ्री करना पॉइंटर का पता 0x00 पर सेट नहीं करता है जैसा कि मुझे लगता है कि आप उम्मीद करते हैं।

यह सिर्फ ओएस को बताता है कि स्मृति क्षेत्र फिर से उपयोग के लिए फिर से उपलब्ध है।

यदि आप free(p) के बाद प्रिंट कर रहे थे, तो आपको समस्याएं होंगी।

+0

आपको अपना जवाब संपादित करना चाहिए और "प्रिंटिंग पी ठीक है ..." को हटा देना चाहिए क्योंकि यह अपरिभाषित व्यवहार है। – Jens

+0

बस यह किया, धन्यवाद। – Sylvain

0

याद रखें: एक सूचक कुछ भी नहीं बल्कि पता है। इससे पहले, आपके मॉलोक या मुफ्त के बाद, यह आपको एक ही परिणाम देगा। Malloc() केवल एक चीज है जो इस पते पर आरक्षित स्थान है। एकमात्र चीज जो मुक्त होती है उसे रिलीज़ करती है (संभवतः, इस पते को अन्य चीज़ों को स्टोर करने के लिए उपयोग करने योग्य के रूप में चिह्नित करें, "सफाई" समय लेने वाली होगी)। यही कारण है कि नि: शुल्क के बाद अपने पॉइंटर को न्यूल में डालना एक अच्छा विचार है; क्योंकि आप सुनिश्चित कर सकते हैं कि सूचक कुछ से जुड़ा हुआ है या नहीं।

+0

'malloc()' यह लौटने वाले पते पर कुछ भी स्टोर नहीं करता है। –

+0

एर ... शायद यह मेरी अंग्रेजी है जो सड़ा हुआ है। "भंडारण" और "भंडारण स्थान" के बीच आप क्या अंतर करेंगे? – Raveline

+0

अंतरिक्ष का संरक्षण मतलब स्मृति प्रबंधन प्रणाली को बता रहा है "इस स्मृति को किसी और को न दें"। भंडारण का मतलब वास्तव में उस जगह में कुछ मूल्य डालना होगा। –

1

malloc() और मेमोरी स्टोरेज एरिया में इसकी रिजर्व स्पेस "हेप" कहलाती है और उस आरक्षित क्षेत्र में एक पॉइंटर लौटाती है। तो p से ऊपर आपके नमूने में, शायद एक चार बाइट मेमोरी क्षेत्र है जो इसके उपयोग के लिए आरक्षित है (जिसका पता इस समय लगभग 154804232 होता है) के लिए एक सूचक दिया जाता है। जब आप *p = 10 करते हैं तो अब आप पूर्णांक मान 10 को स्मृति की ओर इंगित कर रहे हैं। जब आप q = p करते हैं तो आप अब q आरक्षित हीप मेमोरी के समान हिस्से को इंगित कर रहे हैं।

free() और इसके जैसे स्मृति स्मृति को अनदेखा करें। जब आप free() पर कॉल करते हैं तो आप कह रहे हैं "मैं अब इस स्मृति का उपयोग नहीं कर रहा हूं"। सभी free() मेमोरी प्रबंधन प्रणाली को बताता है कि स्मृति का ब्लॉक अब एक बार फिर उपयोग के लिए उपलब्ध है। यह जोरदार रूप से आपके सूचक को बदलता है। यह सिर्फ संकेत करता है कि स्मृति का ब्लॉक उपलब्ध है।उसके बाद यह सुनिश्चित करने के लिए आप पर निर्भर है कि आप उस सूचक का फिर से उपयोग नहीं करते हैं।

यदि आप फिर से उस पॉइंटर का उपयोग करते हैं तो यह ठीक काम कर सकता है। एक बार। या दो बार। या एक हजार बार। यह ठीक से काम करेगा, मूल रूप से, जब तक कि आप किसी और के बाद इसका उपयोग न करें कि आपके द्वारा कहा गया स्मृति ब्लॉक स्वतंत्र है और इसके साथ कुछ करता है। जब यह पारदर्शी होता है, खराब चीजें < टीएम> होती है। कृपया बुरी चीजें न करें।

0

free does not reassign the pointer कुछ और इंगित करने के लिए। वास्तव में, सी मानक सूचक का कुछ भी उल्लेख नहीं करता है। यह सब है यह वर्णन में कहते हैं:

मुक्त समारोह अंतरिक्ष ptr द्वारा की ओर इशारा किया पुनः आवंटित की जाती किया जाना है, है कि, बनाया आगे आवंटन के लिए उपलब्ध होती है। यदि पीआरटी एक शून्य सूचक है, कोई कार्रवाई नहीं होती है। अन्यथा, अगर तर्क एक सूचक से मेल नहीं खाता पहले calloc, malloc, या realloc समारोह से लौट आए हैं, या अगर स्थान खाली या realloc के लिए एक कॉल द्वारा पुनः आवंटित की जाती किया गया है, व्यवहार अपरिभाषित

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