( कृपया पोस्ट पढ़ने से पहले इस पैरा पढ़ेंमैं किसी को भी इस पोस्ट को पढ़ने में दिलचस्पी लेने के लिए कह रहा हूं, इसे ध्यान से पढ़ने की कोशिश करनी चाहिए, और जब तक आप इसे पूरी तरह से समझ नहीं लेते, तब तक इसे कम न करें, धन्यवाद। )
यह अब सामुदायिक विकी है, जैसे कि अगर कोई किसी भी अवधारणा से असहमत है, तो कृपया इसे संशोधित करें और स्पष्ट और विस्तृत विवरण के साथ कि क्या गलत है और क्यों, और यदि संभव हो तो कृपया स्रोतों का हवाला दें या सबूत दें जो पुन: प्रस्तुत किया जा सकता है।
उत्तर
यहाँ कुछ अन्य कारण हैं जो NULL == 0 के लिए अंतर्निहित कारक हो सकते हैं
- यह तथ्य कि शून्य झूठा है, इसलिए व्यक्ति
if(!my_ptr)
इसके बजाय सीधे कर सकता है if(my_ptr==NULL)
।
- तथ्य यह है कि uninitiated वैश्विक पूर्णांक सभी शून्य के लिए डिफ़ॉल्ट रूप से आरंभीकृत होते हैं, और सभी शून्य के इस तरह के एक सूचक को निर्विवाद माना जाएगा।
यहाँ मैं अन्य उत्तरों पर एक शब्द कहना चाहूंगा
सिंथेटिक शुगर के कारण नहीं
यह कहना कि न्यूट्रीशनल शुगर की वजह से NULL शून्य है, बहुत ज्यादा मतलब नहीं है, अगर ऐसा है तो लंबाई रखने के लिए किसी सरणी के इंडेक्स 0 का उपयोग क्यों न करें?
वास्तव में C वह भाषा है जो आंतरिक क्रियान्वयन से बहुत निकट से मिलती है, क्या यह कहने का मतलब है कि C केवल संश्लिष्ट चीनी के कारण शून्य को चुना है? वे शून्य से मैप करने के बजाय एक कीवर्ड शून्य (जैसा कि कई अन्य भाषाएं करते हैं) प्रदान करेंगे!
आज के रूप में इस तरह के रूप में यह सिर्फ चीनी के रूप में किया जा सकता है, यह स्पष्ट है कि सी भाषा डेवलपर्स का मूल इरादा वाक्यविन्यास चीनी के लिए नहीं था, जैसा कि मैं आगे दिखाऊंगा।
1) विशिष्टता
फिर भी यह सच है कि सी विनिर्देश 0 से लगातार अशक्त सूचक (धारा 6.3.2.3) के रूप में बात करता है, और NULL को कार्यान्वयन परिभाषित (C11 विनिर्देश में धारा 7.19, और C99 विनिर्देश में 7.17) के रूप में परिभाषित करता है, तथ्य यह है कि सी के आविष्कारकों द्वारा लिखी गई पुस्तक "द सी प्रोग्रामिंग लैंग्वेज" में खंड 5.4 में कहा गया है:
C गारंटी देता है कि शून्य कभी भी डेटा के लिए एक वैध पता नहीं है, इसलिए शून्य के एक वापसी मूल्य का उपयोग किसी असामान्य घटना को इंगित करने के लिए किया जा सकता है, इस मामले में, कोई स्थान नहीं।
सूचक और पूर्णांक विनिमेय नहीं हैं, शून्य एकमात्र अपवाद है: निरंतर शून्य को एक पॉइंटर को सौंपा जा सकता है, और एक पॉइंटर की तुलना निरंतर शून्य के साथ की जा सकती है। प्रतीकात्मक स्थिरांक NULL का उपयोग अक्सर शून्य के स्थान पर किया जाता है, एक अधिक स्पष्ट रूप से यह इंगित करने के लिए कि एक सूचक के लिए यह एक विशेष मान है। NULL में परिभाषित किया गया है। हम इसके बाद NULL का उपयोग करेंगे।
जैसा कि कोई देख सकता है (शब्द "शून्य पता") से कम से कम सी के लेखकों का मूल इरादा पता शून्य का था, और निरंतर शून्य नहीं, इसके अलावा इस अंश से प्रकट होता है कि विनिर्देश क्यों बोलता है इसका कारण निरंतर शून्य शायद एक अभिव्यक्ति को बाहर करने के लिए नहीं है जो शून्य का मूल्यांकन करता है, बल्कि पूर्णांक निरंतर शून्य को शामिल करने के लिए केवल एक पूर्णांक निरंतर का उपयोग करता है जिसे बिना कास्टिंग के सूचक बिंदु में उपयोग करने की अनुमति है।
2) सारांश
हालांकि विनिर्देश स्पष्ट रूप से यह नहीं कहता है कि शून्य पते को शून्य स्थिर से भिन्न माना जा सकता है, लेकिन यह नहीं कहता है कि ऐसा नहीं है, और तथ्य यह है कि जब शून्य-सूचक निरंतर के साथ काम करता है, तो यह दावा नहीं करता है कि यह कार्यान्वयन के रूप में परिभाषित है। NULL द्वारा परिभाषित स्थिरांक, इसके बजाय शून्य होने का दावा करता है , यह दर्शाता है कि शून्य स्थिरांक और शून्य पते के बीच अंतर हो सकता है।
(हालांकि अगर यह मामला है तो मुझे आश्चर्य होता है कि NULL को क्यों परिभाषित किया गया है, क्योंकि इस तरह के मामले में NULL भी निरंतर शून्य हो सकता है, क्योंकि कंपाइलर को वैसे भी सभी शून्य स्थिरांक को वास्तविक NULL परिभाषित में परिवर्तित करना है?)
हालाँकि मैं इसे वास्तविक कार्रवाई में नहीं देखता, और सामान्य प्लेटफार्मों में पता शून्य और स्थिर शून्य को एक ही माना जाता है, और उसी त्रुटि संदेश को फेंक देते हैं।
इसके अलावा तथ्य यह है कि आज के ऑपरेटिंग सिस्टम वास्तव में पूरे पहले पृष्ठ (0x0000 से 0xFFFF तक) को जला रहे हैं, सिर्फ C के NULL पॉइंटर के कारण शून्य पते तक पहुंचने से रोकने के लिए, ( http://en.wikipedia.org/wiki देखें) Zero_page , साथ ही साथ "Windows Via C / C ++ द्वारा Jeffrey Richter और Christophe Nasarre (Microsoft प्रेस द्वारा प्रकाशित)")।
इस प्रकार मैं किसी से भी यह दावा करने के लिए कहूंगा कि वास्तव में इसने कार्रवाई में देखा है, कृपया प्लेटफॉर्म, और संकलक को निर्दिष्ट करने के लिए, और वास्तव में उसने जो सटीक कोड किया है, (हालांकि विनिर्देश में अस्पष्ट परिभाषा के कारण [जैसा कि मैंने दिखाया है) कोई संकलक और मंच जो चाहे वह करने के लिए स्वतंत्र है)।
हालांकि यह स्पष्ट रूप से लगता है कि सी के लेखकों ने इसे ध्यान में नहीं रखा था, और वे "शून्य पते" की बात कर रहे थे, और यह कि "सी गारंटी देता है कि यह कभी भी वैध पता नहीं है", साथ ही साथ "NULL सिर्फ एक है mnemonic ", स्पष्ट रूप से दिखा रहा है कि यह मूल इरादा" वाक्यविन्यास चीनी "के लिए नहीं था।
ऑपरेटिंग सिस्टम के कारण नहीं
यह भी दावा करते हुए कि ऑपरेटिंग सिस्टम कुछ कारणों से शून्य को संबोधित करने की पहुंच से इनकार करता है:
1) जब C लिखा गया था तो इस तरह का कोई प्रतिबंध नहीं था, जैसा कि कोई इस विकिपीडिया http://en.wikipedia.org/wiki/Zero_page पर देख सकता है ।
2) तथ्य यह है कि सी कंपाइलरों ने मेमोरी एड्रेस को शून्य तक पहुँचा दिया था।
यह बेल्लाबस द्वारा निम्नलिखित पेपर से तथ्य प्रतीत होता है ( http://www.cs.bell-labs.com/who/dmr/primevalC.html )
दो संकलक विवरणों में भिन्न हैं कि वे इसके साथ कैसे सामना करते हैं। पहले एक में, एक फ़ंक्शन का नामकरण करके प्रारंभ पाया जाता है; बाद में, प्रारंभ को केवल 0. लिया जाता है। यह इंगित करता है कि पहला कंपाइलर मेमोरी मैपिंग के साथ एक मशीन होने से पहले लिखा गया था, इसलिए कार्यक्रम की उत्पत्ति स्थान 0 पर नहीं थी, जबकि दूसरे के समय तक, हमारे पास पीडीपी -11 था जो मैपिंग प्रदान करता था।
(वास्तव में आज के रूप में (जैसा कि मैंने विकिपीडिया और माइक्रोसॉफ्ट प्रेस से ऊपर संदर्भों का हवाला दिया है), शून्य पते तक पहुंच को प्रतिबंधित करने का कारण है C के NULL संकेत!
3) याद रखें कि सी का उपयोग ऑपरेटिंग सिस्टम, और यहां तक कि सी कंपाइलर लिखने के लिए भी किया जाता है!
वास्तव में सी को इसके साथ UNIX ऑपरेटिंग सिस्टम लिखने के उद्देश्य से विकसित किया गया था, और इस तरह यह बिना किसी कारण के प्रतीत होता है कि उन्हें खुद को पता शून्य से प्रतिबंधित करना चाहिए।
(हार्डवेयर) कैसे कंप्यूटर हैं पर व्याख्या (शारीरिक रूप से) अभिगम संबोधन शून्य करने में सक्षम
एक और बिंदु है जिसे मैं यहाँ समझाना चाहता हूँ, यह कैसे संभव है कि पता शून्य को संदर्भित किया जाए?
एक सेकंड के लिए इसके बारे में सोचो, पते प्रोसेसर द्वारा प्राप्त किए जाते हैं, और फिर मेमोरी बस पर वोल्टेज के रूप में भेजे जाते हैं, जो तब मेमोरी सिस्टम द्वारा वास्तविक पते पर प्राप्त करने के लिए उपयोग किया जाता है, और फिर भी शून्य के पते का मतलब कोई वोल्टेज नहीं होगा , तो मेमोरी सिस्टम का भौतिक हार्डवेयर पता शून्य तक कैसे पहुंच रहा है?
उत्तर प्रतीत होता है, कि पता शून्य डिफ़ॉल्ट है, और दूसरे शब्दों में पता शून्य हमेशा मेमोरी सिस्टम द्वारा सुलभ है जब मेमोरी बस पूरी तरह से बंद हो जाती है, और इस तरह के किसी भी वास्तविक पते को निर्दिष्ट किए बिना पढ़ने या लिखने के लिए अनुरोध (जो पता शून्य के साथ मामला है) स्वचालित रूप से पता शून्य तक पहुंच रहा है।
if (p != 0)
,if (p)
जो कि C और C ++ में एक सामान्य मुहावरा है, हालाँकि अगर आप जावा को अपनाते हैं तो आपको इस आदत से बाहर निकलना होगा।