2013-08-01 4 views
12

निम्न कोड केवल चार सरणी में पहले वर्ण को इंगित करता है केवल पढ़ने योग्य स्मृति में उपलब्ध है। है सही है कि ?:प्वाइंटर्स टू कॉन्स चार

const char * ptr = "String one"; 

अब ptr शुरू होता है एक और स्मृति स्थान पर बात करने के लिए जब:

ptr = "String two"; 

क्या पहले चार सरणी का क्या होगा? निष्पादन समाप्त होने पर वह स्मृति स्थान मुक्त हो जाता है?

+2

स्ट्रिंग अक्षर स्थिर आवंटन हैं। उन्हें मुक्त होने की आवश्यकता नहीं है। –

+0

इस प्रश्न को भी जांचें: [क्या मुझे स्ट्रिंग-लिटरल्स का उपयोग करके प्रारंभ * प्रारंभ करना चाहिए?] (Http://stackoverflow.com/questions/9504588/should-i-free-char-initialized-using-string-literals) – sidyll

+1

क्यों इसे मुक्त किया जाना चाहिए? सूचक केवल एक अलग स्ट्रिंग को शाब्दिक इंगित करता है और स्वीकृत उत्तर में समझाया गया है कि स्ट्रिंग अक्षर में स्थाई भंडारण अवधि होती है, इसलिए वे मुक्त नहीं होते हैं। – 0decimal0

उत्तर

7

मानक केवल इतना कहता है कि स्ट्रिंग अक्षर में स्थिर भंडारण अवधि है, जिसका अर्थ यह है कि चर का जीवनकाल समाप्त होने तक प्रोग्राम समाप्त होता है और प्रोग्राम शुरू होने पर इसे प्रारंभ किया जाता है।

[...] multibyte चरित्र अनुक्रम तो स्थिर भंडारण अवधि और लंबाई सिर्फ अनुक्रम को शामिल करने के लिए पर्याप्त की एक सरणी प्रारंभ करने में प्रयोग किया जाता है: C11 draft standard के प्रासंगिक अनुभागों 6.4.5 पैरा है। [...]

यह केवल पढ़ने की स्मृति में हो सकता है और संभवतः यह कार्यान्वयन परिभाषित किया गया है। इसे मुक्त करने की आवश्यकता नहीं है, केवल malloc के माध्यम से गतिशील रूप से आवंटित स्मृति को free पर बाद की कॉल की आवश्यकता है।

अगर मैं इस कार्यक्रम का उपयोग करें:

int main() 
{ 
    const char * ptr = "String one"; 

    return 0; 
} 

और हम gcc साथ इसे बनाने और उसके बाद का उपयोग objdump:

objdump -s -j .rodata a.out 

हम चाहते हैं कि मिल जाएगा इस मामले में यह वास्तव में केवल पढ़ने में संग्रहित है डेटा अनुभाग:

Contents of section .rodata: 
    400580 01000200 53747269 6e67206f 6e6500 ....String one. 

आप इसे स्वयं चला सकते हैं here

+0

तो प्रोग्राम बंद होने पर इसे स्वचालित रूप से स्मृति से हटा दिया जाएगा? – 2013Asker

+0

@ 2013Asker हां, जब आपका प्रोग्राम निकलता है तो यह सिस्टम को संसाधनों को छोड़ देगा। –

+4

एक विशिष्ट होस्टेड कार्यान्वयन पर, एक स्ट्रिंग अक्षर शायद स्मृति में होगा जो केवल ऑपरेटिंग सिस्टम द्वारा पढ़ा गया है, भौतिक रोम में नहीं, और प्रोग्राम समाप्त होने पर आपके सभी प्रोग्राम की मेमोरी लगभग निश्चित रूप से रिलीज़ हो जाएगी। एक फ्रीस्टैंडिंग कार्यान्वयन पर, यह एक अलग कहानी हो सकती है; एक बहुत कम-स्तरीय सिस्टम केवल एक प्रोग्राम चला सकता है, जिसका कोड और स्थिर डेटा रोम में संग्रहीत किया जाता है जो कभी मिटा नहीं जाता है। –

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