आपका वैरिएबल d
आमतौर पर स्टैक से पॉपअप नहीं होता है। घुंघराले ब्रेसिज़ एक स्टैक फ्रेम को निरूपित नहीं करते हैं। अन्यथा, आप ऐसा कुछ नहीं कर पाएंगे:
char var = getch();
{
char next_var = var + 1;
use_variable(next_char);
}
यदि घुंघराले ब्रेसिज़ एक सच्चे स्टैक पुश / पॉप (जैसे फ़ंक्शन कॉल होगा) का कारण होता है, तो उपरोक्त कोड संकलित नहीं करेगा क्योंकि ब्रेसिज़ के अंदर का कोड ब्रेसिज़ के var
बाहर रहने वाले चर का उपयोग करने में सक्षम नहीं होगा (जैसे उप- फ़ंक्शन सीधे कॉलिंग फ़ंक्शन में चर का उपयोग नहीं कर सकता है)। हम जानते हैं कि यह मामला नहीं है।
घुंघराले ब्रेसिज़ बस स्कूपिंग के लिए उपयोग किए जाते हैं। कंपाइलर किसी भी एक्सेस को "इनर" वैरिएबल के बाहर से अतिक्रमित ब्रेसिज़ के बाहर अमान्य मान लेगा, और यह उस मेमोरी को किसी और चीज़ के लिए फिर से इस्तेमाल कर सकता है (यह कार्यान्वयन-निर्भर है)। हालाँकि, यह स्टैक से पॉप अप नहीं किया जा सकता है जब तक कि एनक्लोजिंग फ़ंक्शन वापस नहीं आता है।
अद्यतन: यहाँ सी कल्पना का क्या कहना है। स्वचालित भंडारण अवधि वाली वस्तुओं के बारे में (खंड 6.4.2):
एक ऐसी वस्तु जिसके लिए एक चर लंबाई सरणी प्रकार नहीं है, इसका जीवनकाल उस खंड में प्रवेश से फैलता है जिसके साथ यह जुड़ा हुआ है जब तक कि उस ब्लॉक का निष्पादन वैसे भी समाप्त नहीं होता है।
समान खंड "आजीवन" शब्द को (जोर मेरा) के रूप में परिभाषित करता है:
जीवन एक वस्तु का प्रोग्राम निष्पादन के दौरान जो भंडारण है का हिस्सा होता है इसकी गारंटी यह के लिए आरक्षित किया जाना है। एक वस्तु मौजूद है, एक निरंतर पता है, और अपने पूरे जीवनकाल में अपने अंतिम संचित मूल्य को बरकरार रखता है। यदि किसी वस्तु को उसके जीवनकाल के बाहर संदर्भित किया जाता है, तो व्यवहार अपरिभाषित होता है।
यहाँ मुख्य शब्द है, निश्चित रूप से, 'गारंटी'। एक बार जब आप ब्रेसिज़ के आंतरिक सेट के दायरे को छोड़ देते हैं, तो सरणी का जीवनकाल समाप्त हो जाता है। भंडारण अभी भी इसके लिए आवंटित नहीं किया जा सकता है या नहीं (आपका कंपाइलर किसी और चीज के लिए जगह का फिर से उपयोग कर सकता है), लेकिन सरणी तक पहुँचने के लिए कोई भी प्रयास अपरिभाषित व्यवहार को आमंत्रित करता है और अप्रत्याशित परिणामों के बारे में लाता है।
सी कल्पना में स्टैक फ्रेम की कोई धारणा नहीं है। यह केवल बोलता है कि परिणामी कार्यक्रम कैसे व्यवहार करेगा, और कार्यान्वयन विवरण को संकलक पर छोड़ देता है (आखिरकार, एक स्टैकलेस सीपीयू पर कार्यान्वयन काफी भिन्न दिखाई देगा, क्योंकि यह सीपीयू पर हार्डवेयर स्टैक के साथ होता है)। सी अटकल में ऐसा कुछ भी नहीं है जो यह बताता है कि स्टैक फ्रेम कहाँ समाप्त होगा या नहीं होगा। पता करने का एकमात्र वास्तविक तरीका आपके विशेष संकलक / प्लेटफ़ॉर्म पर कोड संकलित करना और परिणामी विधानसभा की जांच करना है। आपके कंपाइलर के ऑप्टिमाइज़ेशन विकल्पों के वर्तमान सेट की भी इसमें भूमिका होगी।
यदि आप यह सुनिश्चित करना चाहते हैं कि d
आपके कोड के चलने के दौरान सरणी अब मेमोरी नहीं खा रही है, तो आप कोड को घुंघराले ब्रेसिज़ में एक अलग फ़ंक्शन में या स्पष्ट रूप से malloc
और free
स्वचालित स्टोरेज का उपयोग करने के बजाय मेमोरी में बदल सकते हैं।