WhozCraig ने इन टिप्पणियों को अब हटाए गए answer पर लिखा है, लेकिन इसे पूर्ण उत्तर में प्रचारित किया जा सकता है (और यही वह है जो मैंने यहां किया है)। वह लिखते हैं:
दिलचस्प ध्यान दें: AS/400, जहां किसी भी गैर वैध सूचक NULL
के समकक्ष माना जाता है एक बहुत ही अनूठा मंच है। यह करने के लिए वे जो मैकेनिक्स नियोजित करते हैं वे बस आश्चर्यजनक होते हैं। इस अर्थ में "मान्य" कोई 128-बिट पॉइंटर है (प्लेटफार्म सब कुछ के लिए 128 बिट रैखिक पता स्थान का उपयोग करता है) जिसमें ज्ञात-विश्वसनीय निर्देश सेट द्वारा प्राप्त "मान" होता है। यह विश्वास करना मुश्किल है, int *p = (int *)1; if (p) { printf("foo"); }
उस प्लेटफ़ॉर्म पर "foo" प्रिंट नहीं करेगा। पी को असाइन किया गया मान स्रोत-भरोसेमंद नहीं है, और इस प्रकार, "अमान्य" माना जाता है और इस प्रकार NULL
के बराबर होता है।
यह स्पष्ट रूप से चौंकाने वाला है कि यह कैसे काम करता है। प्रक्रिया के मैप किए गए वर्चुअल एड्रेस स्पेस में प्रत्येक 16-बाइट अनुच्छेद में प्रक्रिया-व्यापी बिटमैप में एक समान "बिट" होता है। सभी पॉइंटर्स को इन अनुच्छेद सीमाओं में से एक पर अवश्य रहना चाहिए। यदि बिट "जला" है, तो संबंधित पॉइंटर विश्वसनीय स्रोत से संग्रहीत किया गया था, अन्यथा यह अमान्य है और न्यूल के बराबर है। मॉलोक, पॉइंटर गणित इत्यादि के लिए कॉल सभी यह निर्धारित करने में जांच किए जाते हैं कि क्या यह बिट जलाया जाता है या नहीं। और जैसा कि आप कल्पना कर सकते हैं, संरचनाओं में पॉइंटर्स डालने से संरचना पैकिंग के विचार पर चोट लगने की पूरी नई दुनिया आती है।
यह चिह्नित है समुदाय विकी (यह मेरा जवाब नहीं है - मैं क्रेडिट नहीं मिलना चाहिए), लेकिन इसे नष्ट कर दिया जा सकता है अगर WhozCraig अपने ही जवाब लिखता है।
यह दिखाता है कि दिलचस्प पॉइंटर गुणों के साथ वास्तविक प्लेटफॉर्म हैं।
ऐसे प्लेटफॉर्म हैं जहां #define NULL ((void *)0)
सामान्य परिभाषा नहीं है; कुछ प्लेटफार्मों पर यह 0
हो सकता है, अन्य पर 0L
या 0ULL
या अन्य उचित मूल्य जब तक संकलक इसे समझता है। सी ++ को परिभाषा के रूप में ((void *)0)
पसंद नहीं है; सिस्टम जहां सीडर + के साथ हेडर इंटरैक्ट करते हैं, वे शून्य सूचक संस्करण का उपयोग नहीं कर सकते हैं।
मैं एक मशीन जहां एक दिया स्मृति स्थान के लिए char *
पते के लिए प्रतिनिधित्व एक ही स्मृति स्थान के लिए int *
पते से अलग था पर सी सीखा है। यह void *
से पहले के दिनों में था, लेकिन इसका मतलब था कि आपको malloc()
उचित रूप से घोषित किया गया था (char *malloc();
- कोई प्रोटोटाइप नहीं), और आपको स्पष्ट रूप से वापसी प्रकार को सही प्रकार पर डालना पड़ा या आपको कोर डंप मिला। सी मानक के लिए आभारी रहें (हालांकि मशीन में सवाल, आईसीएल Perq - तीन नदियों से खराब हार्डवेयर - मानक को परिभाषित किए जाने के समय काफी हद तक अलग किया गया था)। एक
स्रोत
2013-04-20 20:13:20
आप 'NULL' के बजाय' 0' का उपयोग कर सकते हैं। – pmg
NULL को 'stddef.h' में परिभाषित किया गया है, आपको इसे स्वयं परिभाषित करने की आवश्यकता नहीं है। – Mat
@pmg 0 पोर्टेबल नहीं है अगर मेरे पहले प्रश्न का उत्तर सत्य है – stdcall