2016-03-31 10 views
6

Here और Here मैंने पाया कि ब्लॉक में चर बनाई गई हैं जब निष्पादन कि ब्लॉक में पहुँचता है,ब्लॉक के अंदर परिवर्तनीय जीवनकाल क्या है?

साबित करने के लिए कि मैं करने की कोशिश की इस:

int main() 
{ 

    { 
     char a; 
     printf("Address of a %d \n",&a); 
    } 

    char b; 
    printf("Address of b %d \n",&b); 

} 

जैसी उम्मीद थी पहले बनाया गया था (क्योंकि बाहरी खंड है आंतरिक से जल्दी निष्पादित), और जब निष्पादन आंतरिक ब्लॉक पर पहुंचा तो बनाया गया था। ऊपर दिए गए कोड का आउटपुट:

Address of a 2686766 
Address of b 2686767 

(86 पर परीक्षण किया गया (ढेर नीचे की ओर बढ़ता है, इसलिए अधिक से अधिक पते के साथ चर पहले बनाया गया था))।

लेकिन क्या इस एक के बारे में ?:

int main() 
{ 

    { 
     char a; 
     printf("Address of a %d \n",&a); 
    } // I expected that variable a should be destroyed here 


    { 
     char b; 
     printf("Address of b %d \n",&b); 
    } 

} 

आउटपुट:

Address of a 2686767 
Address of b 2686766 

मैं उम्मीद है कि एक पहले खंड बयान की ब्रेस बंद करने पर नष्ट हो गया था, इसलिए संबोधित जहां एक स्थित था अब ढेर के शीर्ष पर है, और बी यहां बनाया जाना चाहिए, इस प्रकार दोनों पते के ऊपर आउटपुट बराबर होना चाहिए, लेकिन वे नहीं हैं? क्या ब्लॉक के अंत में चर नष्ट हो गए हैं? यदि नहीं, क्यों?

+5

'char *' से 'printf ("% d ") पास करने के लिए अनिर्धारित व्यवहार'। साथ ही, स्वचालित संग्रहण अवधि के साथ अलग-अलग ऑब्जेक्ट्स के सापेक्ष पते निर्दिष्ट नहीं हैं। यह शायद कंपाइलर अनुकूलन सेटिंग्स पर भी निर्भर करता है। – EOF

+1

'printf' में एक सूचक मुद्रित करने के लिए'% p' का उपयोग करें। – Chiel

+0

आपने अपना कोड कैसे संकलित किया? क्या आपने अनुकूलन सक्षम किया? –

उत्तर

10

कंपाइलर स्मृति में चर को कैसे स्थानांतरित करता है इसके लिए कोई नियम नहीं हैं। यह दोनों एक ही समय में दोनों के लिए बहुत अच्छी तरह से आरक्षित जगह हो सकता है, अगर यह किसी भी तरह से "आसान" है।

यह अलग-अलग क्षेत्रों में चर के लिए स्थान का पुन: उपयोग करने की अनुमति है, लेकिन आवश्यक नहीं है। एक बाइट को सहेजना आवंटन को "अनुकूलित" करने की कोशिश करने की परेशानी के लायक नहीं हो सकता है।

0

सी ++ में एक चर को नष्ट करना मतलब है 'इसे विनाशक कह रहा है'। और कुछ नहीं, और कुछ नहीं। चूंकि अंतर्निहित प्रकार char के पास कोई विनाशक नहीं है, इसलिए उन्हें नष्ट करना पर्यवेक्षक के लिए दृश्यमान नहीं है।

+0

मैं जानना चाहता हूं कि मेरे उत्तर में क्या गलत है। – SergeyA

+0

@NathanOliver, और मैंने अन्यथा कहां कहा? – SergeyA

+0

@NathanOliver, क्या आपके पास इसके लिए कोई सबूत है? मान ली बी एक char नहीं है लेकिन साइड-इफेक्ट कन्स्ट्रक्टर के साथ एक ऑब्जेक्ट है, जब आपको लगता है कि कन्स्ट्रक्टर निष्पादित किया जाएगा? – SergeyA

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