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