मुझे पता है कि जब हम कॉलर को स्थानीय चर पता लौटाते हैं। लटकता हुआ हो जाता है। इसे ठीक करने के लिए, हमें स्थैतिक का उपयोग करने की आवश्यकता है। यहां x दायरे से बाहर हो जाता है, इसलिए समस्या उत्पन्न होती है।

int *fun()
{
    // x is local variable and goes out of
    // scope after an execution of fun() is
    // over.
    int x = 5;

    return &x;
}


int main()
{
    int *p = fun();
    

    // p points to something which is not
    // valid anymore
    printf("%d", *p);
    return 0;
}

यह कोई समस्या क्यों नहीं है जब हम इसके पते के बजाय x का मान लौटाते हैं। इस मामले में भी x का मान स्थानीय है और p के कॉलर मान में एक कचरा होना चाहिए, क्योंकि स्थानीय चर x का दायरा समाप्त होता है।

int fun()
{
    int x=5;
    return x;
}

main()
{
    int p;
    p = fun();
    printf("%d", p);
}
0
Ravi 17 जुलाई 2021, 07:25

2 जवाब

सबसे बढ़िया उत्तर

सी भाषा में कार्य चर की प्रतियां प्राप्त करते हैं और वापस करते हैं। तो आपको स्थानीय चर के साथ समस्या नहीं है जो अस्तित्व में नहीं है - क्योंकि आप इस चर के मूल्य की प्रतिलिपि के साथ काम करते हैं।

1
Igor_M 17 जुलाई 2021, 18:08

यहाँ स्मृति की अवधारणा खेल में आती है। आपकी कोड मेमोरी को 3 खंडों में विभाजित किया गया है, अर्थात् कोड ब्लॉक, हीप और स्टैक। जब आप प्रत्येक फ़ंक्शन को कॉल करते हैं, तो फ़ंक्शन स्थानीय चर स्टैक में संग्रहीत हो जाता है और फ़ंक्शन समाप्त होते ही स्वचालित रूप से हटा दिया जाता है। अपने दूसरे कोड में आपने अपने वेरिएबल पी को मुख्य फ़ंक्शन में घोषित किया है, और इसमें वह मान होता है जो fun() द्वारा लौटाया जाता है। एक फ़ंक्शन केवल तभी समाप्त होता है जब यह कुछ मान फेंकता है, यहां आपके कोड पी में मस्ती द्वारा लौटाया गया मान असाइन किया गया है स्टैक ब्लॉक में फ़ंक्शन वैरिएबल हटाए जाने से पहले। यहां हम केवल x वेरिएबल की कॉपी का उपयोग कर रहे हैं जो कंपाइलर द्वारा हटाए जाने से पहले P को असाइन किया गया है।

-2
faizal khan 17 जुलाई 2021, 04:35