0x0 स्थान की ओर इशारा करते सूचक और NULL को इंगित करने वाले सूचक के बीच क्या अंतर है?


12

क्या एक पॉइंटर 0x0000 की ओर इशारा करता है जो NULL के लिए एक पॉइंटर के समान है? यदि NULL मान C भाषा में परिभाषित किया गया है, तो यह किस स्थान पर भौतिक रूप से अनुवाद करता है? क्या यह 0x0000 के समान है। मुझे इन अवधारणाओं के बारे में अधिक जानकारी कहां मिल सकती है?


1
यह स्टैक ओवरफ्लो पर पहले ही पूछा जा चुका है - stackoverflow.com/questions/1296843/… । मुझे लगता है कि यह हमारे लिए सीमावर्ती है, लेकिन मैं इसे फिलहाल संदेह का लाभ देने के लिए तैयार हूं।
ChrisF

जवाबों:


12

एक बिंदु जो यहां दिए गए अधिकांश उत्तरों को संबोधित नहीं कर रहा है, कम से कम स्पष्ट रूप से नहीं है, यह है कि एक अशक्त सूचक एक ऐसा मूल्य है जो निष्पादन के दौरान मौजूद है, और एक शून्य सूचक स्थिरांक एक सिंथैटिक निर्माण है जो सी स्रोत कोड में मौजूद है।

एक अशक्त सूचक स्थिरांक , जैसा कि कार्लसन का उत्तर सही बताता है, या तो मान 0 (एक साधारण 0सबसे सामान्य उदाहरण है) के साथ पूर्णांक स्थिर अभिव्यक्ति है , या इस तरह की अभिव्यक्ति void*(जैसे (void*)0)।

NULLएक मैक्रो है, जिसे <stddef.h>कई अन्य मानक हेडर में परिभाषित किया गया है , जो कार्यान्वयन-परिभाषित नल पॉइंटर निरंतर तक फैलता है । विस्तार आम तौर पर 0या ((void*)0)(बाहरी कोष्ठक अन्य भाषा नियमों को पूरा करने के लिए आवश्यक हैं)।

तो एक शाब्दिक 0, जब एक ऐसे संदर्भ में उपयोग किया जाता है जिसे सूचक प्रकार की अभिव्यक्ति की आवश्यकता होती है, तो हमेशा एक null pointer, यानी, एक अद्वितीय सूचक मूल्य का मूल्यांकन करता है जो किसी वस्तु को इंगित नहीं करता है। यह अशक्त सूचक के प्रतिनिधित्व के बारे में कुछ भी नहीं बताता है । अशक्त बिंदुओं को आमतौर पर ऑल-बिट्स-शून्य के रूप में दर्शाया जाता है, लेकिन उन्हें कुछ भी कहा जा सकता है। लेकिन भले ही एक अशक्त सूचक के रूप में प्रतिनिधित्व किया है , या अभी भी एक अशक्त सूचक स्थिर है0xDEADBEEF0(void*)0

इस उत्तर के लिए stackoverflow पर सवाल यह अच्छी तरह से शामिल किया गया।

इसका तात्पर्य, अन्य बातों के अलावा, यह memset()या calloc(), जो मेमोरी के क्षेत्र को ऑल-बिट्स-जीरो पर सेट कर सकता है, जरूरी नहीं कि उस क्षेत्र में किसी बिंदु को शून्य बिंदुओं पर सेट किया जा सके। वे अधिकांश कार्यान्वयन पर ऐसा करने की संभावना रखते हैं, लेकिन भाषा इसकी गारंटी नहीं देती है।

मैं क्यों इस सवाल का डुप्लिकेट नहीं माना जाता है पता नहीं है यह एक , या कैसे इसे यहाँ सामयिक है।


1
सी के डिजाइन और विकास के साथ मेरा एक झोंका यह है कि अंक शून्य का उपयोग अशक्त सूचक के गैर-अपवर्तित प्रतिनिधित्व के रूप में किया जाता रहा है। भाषा के शुरुआती दिनों में वापस (उदाहरण के लिए फ़ंक्शन प्रोटोटाइप जैसी चीजों के आगमन से पहले), संकेत और पूर्णांक पर्याप्त रूप से विनिमेय थे जो एक अशक्त सूचक के लिए "0" का उपयोग करना सरल था और यह "बस काम करेगा"। एक बार पूर्णांक मात्रा शून्य और एक शून्य सूचक के बीच अंतर करना आवश्यक हो गया, हालांकि, "0" प्रतिनिधित्व को एक कीवर्ड या ऑपरेटर अनुक्रम के पक्ष में पदावनत किया जाना चाहिए था।
सुपरकैट

क्या इसका मतलब यह है कि NULL पॉइंटर वास्तव में किसी स्थान पर इंगित कर सकता है जब उसे प्लेटफॉर्म के आधार पर NULL सौंपा जाता है? अशक्त सूचक स्थिर शायद एक सिंटैक्टिक निर्माण होता है लेकिन कोड चलने पर वास्तव में क्या होता है? मान लें कि इस सिंटैक्टिक निर्माण को जीएनयू / लिनक्स प्लेटफॉर्म पर संकलित किया गया है। जब हम इसे NULL असाइन करते हैं तो पॉइंटर मान क्या होता है? यह पता किसी अन्य पते से कैसे भिन्न है?
अर्पित

1
@Arpith: NULLकिसी पॉइंटर ऑब्जेक्ट पर असाइन या किसी नल पॉइंटर को स्थाई करने के लिए, उस ऑब्जेक्ट का मान नल पॉइंटर को सेट करता है । मशीन के स्तर पर, यह अच्छी तरह से मेमोरी के कुछ मान्य चंक को इंगित कर सकता है। एक अशक्त सूचक को हटाने से अपरिभाषित व्यवहार होता है; पते पर स्मृति का एक हिस्सा तक पहुंचना 0x0000000वैध व्यवहार है, जैसा कि शाब्दिक रूप से कुछ और है। वह पता किसी भी अन्य पते से भिन्न होता है (ए) के बराबर की तुलना NULL, और (बी) किसी भी वस्तु के लिए किसी भी सूचक से असमान की तुलना करता है। अशक्त सूचक एक मनमाना सूचक सूचक है जिसका उपयोग यह इंगित करने के लिए किया जाता है कि यह किसी भी चीज़ की ओर इशारा नहीं करता है।
कीथ थॉम्पसन

1
मशीन के स्तर पर, यह मेमोरी के कुछ वैध चंक को इंगित कर सकता है , लेकिन अधिकांश सी वातावरणों में यह अमान्य मेमोरी को इंगित करेगा ताकि पॉइंटर का उपयोग करने के किसी भी प्रयास के परिणामस्वरूप हार्डवेयर जाल / गलती / अपवाद हो। यह आमतौर पर केवल सबसे सरल हार्डवेयर प्लेटफार्मों पर होता है --- मेमोरी प्रबंधन के लिए कोई समर्थन नहीं है --- जहां एक NULL पॉइंटर एक मान्य मेमोरी स्थान पर इंगित करता है।
सोलोमन स्लो

7

हर प्लेटफ़ॉर्म पर NULL को परिभाषित करने के लिए स्वतंत्र है जैसा कि वह चाहता है।

सी स्टैंडर्ड के अनुसार, यदि आप शून्य को एक पॉइंटर में असाइन करते हैं तो इसे NULL मान (उस प्लेटफ़ॉर्म के लिए) में बदल दिया जाएगा। हालाँकि, यदि आप NULL पॉइंटर लेते हैं और इसे इंट में डालते हैं, तो कोई गारंटी नहीं है कि आपको शून्य मिलेगा वहाँ से बाहर हर प्लेटफार्म पर। हालांकि तथ्य यह है कि अधिकांश प्लेटफार्मों पर यह शून्य होगा।

उस सामान के बारे में जानकारी जो आप द सी लैंग्वेज स्पेसिफिकेशन में पा सकते हैं । एक स्रोत, जिस भरोसे के लिए मैं व्रत नहीं कर सकता, वह यह है: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf


2
यदि वे मानक से अलग होना चुनते हैं तो वे पुनर्परिभाषित करने के लिए स्वतंत्र हैं NULL pointer constant। जहाँ तक मुझे पता है कि वहाँ कोई संकलक नहीं हैं जो ऐसा करते हैं।
कार्लसन 15

क्या कोई कंपाइलर है जो NULL को 0 के रूप में लागू नहीं करता है? और क्या झूठी का मूल्यांकन करने की गारंटी है?
बदसूरत

NULL को मानक द्वारा गलत का मूल्यांकन करने की गारंटी है। मुझे नहीं पता कि कोई कंपाइलर (प्लेटफॉर्म, वास्तव में) है जो NULL को 0 के रूप में लागू नहीं करता है, और मुझे इस पर गंभीरता से संदेह है, लेकिन मानक इसे प्रतिबंधित नहीं करता है, इसलिए कौन जानता है।
माइक नाकिस

स्मृति में अमूर्त "अशक्त सूचक स्थिर" (जैसा कि उल्लेख में है) के प्रतिनिधित्व के बीच भ्रम है, जो कि प्लेटफ़ॉर्म मेकर के रूप में हो सकता है और NULLमैक्रो की परिभाषा हो सकती है , जिसे 0C ++ और या तो 0या C में विस्तार करना होगा (void *)0, क्योंकि वह असली "अशक्त सूचक स्थिर" है।
Jan Hudec

जबकि NULL को सिद्धांत के रूप में कुछ भी परिभाषित किया जा सकता है, फिर भी मानक द्वारा एक गारंटी है कि मान 0 के साथ एक int निरंतर सूचक को टाइप करने के लिए एक अशक्त सूचक (ISO 9899: 1999 6.3.2.3/3) होगा। Stddef.h का NULL मैक्रो एक अशक्त सूचक (7.17 / 3) होना चाहिए, इसलिए यह कंपाइलर के लिए NULL को 0 या (void *) 0 के रूप में लागू न करने के लिए बहुत बोझिल होगा।

1

इसे C भाषा में परिभाषित किया गया है क्योंकि कोई भी ऐसी मशीन नहीं है जिसका पता उसके पास हो। अगर यह किया है, हम इसे से एक अमूर्त की जरूरत नहीं होगी! हालांकि अधिकांश प्लेटफार्मों पर, NULL को अंततः किसी प्रकार या अन्य के 0 के रूप में लागू किया जा सकता है, यह मानना ​​गलत है कि यह सार्वभौमिक है, यदि आप पोर्टेबिलिटी के बारे में बिल्कुल भी ध्यान रखते हैं।



0

सी मानक दस्तावेज़ अनुभाग के अनुसार 6.3.2.3:

मान 0 के साथ पूर्णांक स्थिर अभिव्यक्ति, या शून्य टाइप करने के लिए इस तरह का एक अभिव्यक्ति, * शून्य सूचक स्थिरांक कहा जाता है। 5) यदि एक अशक्त सूचक स्थिरांक को सूचक प्रकार में परिवर्तित किया जाता है, तो परिणामी सूचक, जिसे अशक्त सूचक कहा जाता है, किसी वस्तु या कार्य के लिए सूचक की असमानता की तुलना करने की गारंटी।

अभी तक मैंने ऐसा कंपाइलर नहीं देखा है जो इससे दूर हो गया हो।


@ PéterTörök आप सही हैं यह एक टाइप है। :)
कार्लसन

1
हां, लेकिन ध्यान दें कि यह सूचक के बारे में कुछ भी नहीं कहता है कि वास्तव में 0. का संख्यात्मक मूल्य है। हालांकि, अधिकांश प्लेटफार्मों पर ऐसा नहीं हो सकता है।
जन हुदेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.