Dangling Pointer क्या है? (Dangling Pointer In C in Hindi)

हेलो फ्रेंड्स, आज के इस आर्टिकल में हम बात करने वाले है Dangling Pointer के बारे में | 

मगर Dangling Pointer क्या है? ये जानने से पहले आपको कुछ बेसिक चीजों के बारे में जानकारी होना जरुरी है | तो आइये सबसे पहले जानते है उन बेसिक चीजों के बारे में | 

  • प्रोग्राम जब स्टार्ट होता है तब प्रोग्राम को रैम में कुछ मेमोरी मिलती है और फिर जब प्रोग्राम के अंदर के फंक्शन कॉल होते है तब इन फंक्शन्स को, प्रोग्राम को मिली मेमोरी स्पेस में से कुछ स्पेस मेमोरी में मिलती है और जैसे ही इन फंक्शन का कार्य समाप्त होता है इनको मिली मेमोरी भी deallocate हो जाती है | 
  • जिस तरह फंक्शन को मेमोरी allocate होती है उसी तरह वेरिएबल्स को भी मेमोरी allocate होती है |  
  • वेरिएबल को allocate मेमोरी स्पेस केवल वेरिएबल के लाइफ तक रहता है जैसे ही वेरिएबल नस्ट होता है उनको मिली मेमोरी स्पेस भी deallocate हो जाता है | 
  • किसी वेरिएबल की लाइफ केवल उस ब्लॉक या फंक्शन तक सिमित होता है जिस ब्लॉक या फंक्शन में वो डिक्लेअर होता है |

आइये अब हम जानते है कि Dangling Pointer क्या है? (What Is Dangling Pointer In C in Hindi)

Dangling Pointer In C in Hindi

Dangling Pointer क्या है? (What Is Dangling Pointer In C in Hindi)

Dangling Pointer एक ऐसा पॉइंटर होता है जो illegal (deleted or freed) मेमोरी एड्रेस को पॉइंट करता है |

Dangling Pointer द्वारा illegal एड्रेस को पॉइंट करने से प्रोग्राम के क्रैश होने की सम्भावना होती है इसलिए प्रोग्राम बनाते समय ये बात ध्यान रहे कि कोई भी पॉइंटर किसी illegal एड्रेस को पॉइंट न करे |

आइये Dangling Pointer को हम एक प्रोग्राम के द्वारा अच्छे से समझते है |

Example Program 

#include<stdio.h>
void fun(void); 
int main()
{

fun();

return (0);
}
void fun()
{ 
  int *p;
  {
   int x;
   p = &x;
  }
}

इस प्रोग्राम को आप एक बार ध्यान से देखे! इस प्रोग्राम में हमने main() फंक्शन के अंदर fun() नाम से एक फंक्शन को कॉल किया है जिसका डिक्लेरेशन हमने main()  फंक्शन के उपर किया है और इसका डेफिनिशन main() फंक्शन के निचे किया है | 

जैसे ही main() फंक्शन प्रोग्राम में आता है इसका execution स्टार्ट हो जाता है | फिर यह fun() फंक्शन को कॉल कर देता है और जैसे ही fun() फंक्शन कॉल होता है fun() फंक्शन को मेमोरी में कुछ स्पेस मिलता है और fun() फंक्शन के अंदर पॉइंटर वेरिएबल p बन जाता है जिसकी लाइफ fun() फंक्शन के लाइफ के बराबर होता है | 

इस fun() फंक्शन के अंदर एक और ब्लॉक है जिसके अंदर x नाम से एक वेरिएबल है जिसके एड्रेस को हमने पॉइंटर p में स्टोर कराया है | 

इस x वेरिएबल की लाइफ केवल उस ब्लॉक तक सिमित है जिस ब्लॉक में यह डिक्लेअर है इसलिए जैसे ही प्रोग्राम उस ब्लॉक से निकलता है x वेरिएबल डिस्ट्रॉय हो जाता है और x वेरिएबल के डिस्ट्रॉय होने से x वेरिएबल को मिला मेमोरी एड्रेस भी deallocate हो जाता है | 

चूँकि अब x वेरिएबल को मिला एड्रेस deallocate हो चूंकि है इसलिए पॉइंटर अब ऐसे मेमोरी एड्रेस को पॉइंट कर रहा होता है जिसका अपना कोई वजूद नहीं है इसलिए ऐसा पॉइंटर अब एक Dangling Pointer कहलाता है | 

Dangling Pointer बनने के कुछ महत्वपूर्ण कारण

Dangling Pointer बनने के ये कुछ कारण है जिसे हमे प्रोग्राम बनाते समय avoid करना चाहिए | 

  • Access a local variable outside of its lifetime
  • De-allocation of memory
  • Function Call

Access a local variable outside of its lifetime

जैसे की हम जानते है, किसी वेरिएबल की लाइफटाइम केवल उस ब्लॉक तक सिमित होती है जिस ब्लॉक में वह डिक्लेअर होता है | 

चूँकि वेरिएबल की लाइफ सिमित है इसलिए जैसे ही प्रोग्राम का कण्ट्रोल उस ब्लॉक (जिस ब्लॉक में वेरिएबल डिक्लेअर था) से निकलता है तो वेरिएबल डिस्ट्रॉय हो जाता है और जैसे ही वेरिएबल डिस्ट्रॉय होता है वेरिएबल की मिली मेमोरी स्पेस भी de-allocate या फ्री हो जाता है | 

मगर यदि उस वेरिएबल को कोई पॉइंटर पहले से रेफर कर रहा होता है तो वह अब एक illegal एड्रेस को रेफर कर रहा होगा है क्योकि वेरिएबल को मिली वेरिएबल के डिस्ट्रॉय होने के साथ ही फ्री हो चूँकि है | ऐसे में अब ये पॉइंटर एक Dangling Pointer बन चुका है जो एक illegal एड्रेस को पॉइंटर कर रहा है | 

Example -:

#include <stdio.h>
int main()
{
    int *p;
    {
        //block
        int num = 27;
        p = #
    }
    //here p is dangling pointer
    return 0;
}

De-allocation of memory

आइये इसको हम एक उदाहरण से समझते है -:

Example -:

// Deallocating a memory pointed by ptr causes dangling pointer
#include <stdlib.h>
#include <stdio.h>
int main()
{

int *ptr = (int *)malloc(sizeof(int));

// After below free call, ptr becomes a dangling pointer
free(ptr);
	
// No more a dangling pointer
ptr = NULL;

return 0;
}

जब कोई पॉइंटर फ्री हो चुकी मेमोरी ब्लॉक को पॉइंटर करता है तब Dangling Pointer क्रिएट होता है इस उदाहरण में ptr पॉइंटर को मिली मेमोरी जब free() फंक्शन द्दारा रिलीज़ कर दिया गया तब यह ptr पॉइंटर एक ऐसे मेमोरी ब्लॉक को पॉइंटर कर रहा था जो की अब फ्री हो चूका है | 

Function Call

आइये इसको भी हम एक उदाहरण से समझते है -:


// The pointer pointing to local variable becomes
// dangling when local variable is not static.
#include<stdio.h>

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();
	fflush(stdin);

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

Output -:

A garbage Address

इस प्रोग्राम में पॉइंटर p, एक fun() फंक्शन को कॉल करता है जो बदले में लोकल वेरिएबल x का एड्रेस रिटर्न करता है | और जैसे की हम जानते है लोकल वेरिएबल का स्कोप केवल उस ब्लॉक तक सिमित होता है जिस ब्लॉक में वह डिक्लेअर होता है इसलिए यहाँ p एक Dangling Pointer है क्योकि वह ऐसे एड्रेस (x वेरिएबल का एड्रेस जो की फंक्शन execution  ख़तम होने के साथ ही डिस्ट्रॉय हो जाता है) को पॉइंटर कर रहा है | 

Dangling Pointer Errors कैसे Avoid करे? (How to avoid the dangling pointer errors)

pointer में NULL वैल्यू initialize करके dangling pointer जैसे errors को avoid किया जा सकता है | यदि हम पॉइंटर को NULL वैल्यू assign करते हैं, तो पॉइंटर de-allocated memory ब्लॉक को इंगित नहीं करेगा। पॉइंटर को NULL वैल्यू assign करने का अर्थ है कि पॉइंटर किसी मेमोरी लोकेशन की ओर इशारा नहीं कर रहा है।

Example -: 

// Deallocating a memory pointed by ptr causes dangling pointer

#include <stdlib.h>
#include <stdio.h>
int main()
{
int *ptr = (int *)malloc(sizeof(int));

// After below free call, ptr becomes a dangling pointer
free(ptr);
	
// No more a dangling pointer
ptr = NULL;
}

Conclusion

दोस्तों आशा करता हु कि आज के इस आर्टिकल को पढ़ने के बाद आपको Dangling Pointer क्या है? (What Is Dangling Pointer In C in Hindi) से संबंधित सभी जानकारी मिल गई होगी |

अगर आप सी लैंग्वेज का Complete Tutorial चाहते है तो मेरे इस पोस्ट C Language Tutorial In Hindi को देखे यहाँ आपको C Programming Language के सभी टॉपिक्स step by step मिल जाएगी |

दोस्तों आशा करता हु कि आपको ये पोस्ट पसंद आई होगी और अगर आपको ये पोस्ट पसंद आया है तो इस पोस्ट को अपने अपने दोस्तों को शेयर करना न भूलिएगा ताकि उनको भी Dangling Pointer क्या है? (What Is Dangling Pointer In C in Hindi) से संबंधित जानकारी प्राप्त हो सके |

अगर आपको अभी भी Dangling Pointer In C in Hindi से संबंधित कोई भी प्रश्न या Doubt है तो आप जरूर बताये मैं आपके सभी सवालों का जवाब दूँगा और ज्यादा जानकारी के लिए आप हमसे संपर्क कर सकते है |

ऐसे ही नयी टेक्नोलॉजी, Programming Language, Coding , C Language, C++, Python Course , Java Tutorial से रिलेटेड जानकारियाँ पाने के लिए हमारे इस वेबसाइट को सब्सक्राइब कर दीजिए | जिससे हमारी आने वाली नई पोस्ट की सूचनाएं जल्दी प्राप्त होगी |

Jeetu Sahu is A Web Developer | Computer Engineer | Passionate about Coding, Competitive Programming and Blogging

Leave a Comment