क्यों ptr लटकता हुआ सूचक है। मुझे पता है कि "सी" दायरे से बाहर है, लेकिन सी का पता अभी भी आंतरिक ब्लॉक से मान्य है। और जब मैं *ptr प्रिंट करता हूं तो मुझे सही मान यानी 5 मिलता है।

void main()
{
   int *ptr;
   
   {
       int ch = 5;
       ptr = &ch;
   } 
  
  
  printf("%d", *ptr);
}
0
Ravi 17 जुलाई 2021, 10:00

1 उत्तर

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

ptr स्मृति के लिए एक संकेतक है जो अब आपके पास नहीं है और इसमें आपके द्वारा अपेक्षित मूल्य सहित कुछ भी शामिल हो सकता है। जो 5 आप देख रहे हैं वह सिर्फ एक बचा हुआ है, इसे कभी भी ओवरराइट किया जा सकता है। आप यहां जो देख रहे हैं वह अपरिभाषित व्यवहार है।

इस साधारण मामले में संकलक द्वारा उत्पन्न कोड सबसे अधिक संभावना है कि संकलक इस प्रोग्राम के लिए कोड उत्पन्न करेगा (जो पूरी तरह से कानूनी है) और शायद यही कारण है कि आपको 5 मिलता है:

void main()
{
   int *ptr;
   
   int ch = 5;
   ptr = &ch;
   
   printf("%d", *ptr);
}

इस मामले पर विचार करें जो थोड़ा अधिक जटिल है:

int *foo()
{
    int ch = 5;
    return &ch;
}

void main()
{
  int* ptr = foo();

  printf("%d ", *ptr);
  printf("%d ", *ptr);
}

यहाँ आउटपुट हो सकता है कुछ इस तरह हो:

5 45643

पहली बार आपको 5 मिल सकते हैं क्योंकि स्मृति अभी तक अधिलेखित नहीं हुई है, दूसरी बार आपको कुछ और मिलता है क्योंकि इस बीच स्मृति अधिलेखित हो गई है।

ध्यान रखें कि आउटपुट कुछ और हो सकता है या यह क्रैश भी हो सकता है, क्योंकि यह अपरिभाषित व्यवहार है।

इसे भी पढ़ें: क्या स्थानीय वैरिएबल की मेमोरी हो सकती है इसके दायरे से बाहर पहुँचा?, यह लेख C++ के लिए है लेकिन यह C भाषा पर भी लागू होता है।

3
Jabberwocky 17 जुलाई 2021, 18:52