अशक्त सूचक मान एक अच्छी तरह से परिभाषित "कहीं नहीं" का प्रतिनिधित्व करता है; यह एक अमान्य सूचक मान है जो किसी अन्य सूचक मान के लिए असमान की तुलना करने की गारंटी है। एक अनिर्णायक व्यवहार में एक शून्य सूचक परिणाम को रोकने की कोशिश कर रहा है, और आमतौर पर एक रनटाइम त्रुटि का कारण होगा, इसलिए आप यह सुनिश्चित करना चाहते हैं कि एक सूचक इसे बाधित करने का प्रयास करने से पहले NULL नहीं है। C और C ++ लाइब्रेरी फ़ंक्शंस की एक संख्या एक त्रुटि स्थिति को इंगित करने के लिए अशक्त सूचक लौटाएगी। उदाहरण के लिए, लाइब्रेरी फ़ंक्शन malloc
एक अशक्त सूचक मान लौटाएगा यदि यह अनुरोध किए गए बाइट्स की संख्या को आवंटित नहीं कर सकता है, और उस पॉइंटर के माध्यम से मेमोरी तक पहुंचने का प्रयास (आमतौर पर) एक रनटाइम त्रुटि का कारण होगा:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
इसलिए हमें यह सुनिश्चित करने की आवश्यकता है कि NULL malloc
के p
विरुद्ध मूल्य की जाँच करके कॉल सफल हुई :
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
अब, अपने मोजे को एक मिनट के लिए लटकाएं, इससे थोड़ा ऊब होने वाला है।
एक अशक्त सूचक है मान और एक अशक्त सूचक स्थिरांक है , और दो जरूरी समान नहीं हैं। अशक्त सूचक मान वह है जो "आर्किटेक्चर" का प्रतिनिधित्व करने के लिए अंतर्निहित वास्तुकला का उपयोग करता है। यह मान 0x00000000, या 0xFFFFFFFF, या 0xDEADBEEF, या कुछ पूरी तरह से अलग हो सकता है। यह मत समझो कि अशक्त सूचक मान हमेशा 0 होता है।
अशक्त सूचक स्थिर , OTOH, हमेशा 0-मूल्यवान अभिन्न अभिव्यक्ति है। जहाँ तक आपके स्रोत कोड का संबंध है, 0 (या किसी भी अभिन्न अभिव्यक्ति जो 0 का मूल्यांकन करता है) एक अशक्त सूचक का प्रतिनिधित्व करता है। C और C ++ दोनों NULL मैक्रो को नल पॉइंटर स्थिर के रूप में परिभाषित करते हैं। जब आपका कोड संकलित किया जाता है, तो null पॉइंटर स्थिरांक को जनरेट मशीन कोड में उपयुक्त null पॉइंटर मान से बदल दिया जाएगा ।
इसके अलावा, ध्यान रखें कि NULL कई संभावित अमान्य पॉइंटर मानों में से केवल एक है ; यदि आप स्पष्ट रूप से इसे शुरू करने के बिना एक ऑटो पॉइंटर चर घोषित करते हैं, जैसे कि
int *p;
चर में शुरू में संग्रहीत मूल्य अनिश्चित है , और एक वैध या सुलभ स्मृति पते के अनुरूप नहीं हो सकता है। दुर्भाग्य से, यह बताने का कोई (पोर्टेबल) तरीका नहीं है कि इसका उपयोग करने का प्रयास करने से पहले एक गैर-पूर्ण सूचक मान मान्य है या नहीं। इसलिए यदि आप पॉइंटर्स के साथ काम कर रहे हैं, तो आमतौर पर यह एक अच्छा विचार है कि जब आप उन्हें घोषित करते हैं, तो उन्हें स्पष्ट रूप से NULL से आरंभ करें और जब वे सक्रिय रूप से किसी चीज़ की ओर इशारा नहीं करते हैं, तो उन्हें NULL में सेट करें।
ध्यान दें कि यह C ++ की तुलना में C में एक समस्या है; मुहावरेदार C ++ को पॉइंटर्स का उपयोग नहीं करना चाहिए।