2009-08-14 15 views
8

(मुझे पता है कि क्या शून्य है और इसके लिए क्या उपयोग किया जाता है)वास्तव में शून्य क्या मूल्य है?

प्रश्न: ठीक है, कहें कि हम किसी भी भाषा में किसी ऑब्जेक्ट का संदर्भ देते हैं। कंप्यूटर उस संदर्भ के लिए स्मृति में थोड़ा 32-बिट (या कंप्यूटर का डिज़ाइन के आधार पर अन्य आकार) बनाता है। उस स्मृति को उस मान को असाइन किया जा सकता है जो स्मृति में ऑब्जेक्ट के स्थान का प्रतिनिधित्व करता है। लेकिन जब मैं शून्य के संदर्भ को सेट करता हूं, तो वास्तव में इसका क्या मूल्य होता है? (संदर्भ में अलग-अलग बिट्स क्या हैं) क्या बिट्स सिर्फ शून्य हो गए हैं? लेकिन क्या यह स्मृति में भी एक स्थान नहीं होगा? कंप्यूटर कैसे बताता है कि किसी ऑब्जेक्ट के संदर्भ के संदर्भ में संदर्भ शून्य है?

मुझे पता है कि यह एक "महत्वपूर्ण" प्रश्न नहीं है, लेकिन मैं उत्सुक हूं कि यह कैसे काम करता है।

धन्यवाद लोग: डी

+0

देखें http://en.wikipedia.org/wiki/Pointer_(computing)#The_null_pointer (लेकिन मुझे सिर्फ उत्तर में विकिपीडिया उद्धृत करने से नफरत है)। –

उत्तर

14

(मैं जहां इस निर्दिष्ट किया जाता है लगता है मैं अब तक नाकाम रहने रहा हूँ मैं देख रखेंगे कोशिश कर दिया गया है, और ... लेकिन यह केवल कार्यान्वयन है कि किसी भी समझ में आता है है।।) कर रहे हैं जवाब देने के लिए दो हिस्सों:

  • मूल्य शून्य है (यानी मूल्य में सभी बिट्स शून्य कर रहे हैं।)
  • शून्य एक वैध पते पर विचार कभी नहीं किया गया है।

दूसरी बात यह है कि आपके प्रश्न का उत्तर क्यों है, लेकिन क्या यह स्मृति में भी एक स्थान नहीं होगा? " "नहीं" है - यह केवल एक नियम है कि शून्य को मान्य स्मृति स्थान नहीं माना जाता है। इसे एक्सेस करने का प्रयास अपवाद का कारण बन जाएगा।

संपादित करें:According to Wikipedia (इसलिए यह बात सही होनी चाहिए 8-) "कुछ आर्किटेक्चर एक हस्ताक्षरित पता स्थान का उपयोग करें और सबसे नकारात्मक मान का उपयोग"। तो यह सभी आर्किटेक्चर पर जरूरी नहीं है, लेकिन किसी दिए गए आर्किटेक्चर पर जो भी मूल्य है, वह मान अमान्य स्मृति स्थान माना जाता है।

+2

"यह केवल एक नियम है कि शून्य को मान्य स्मृति स्थान नहीं माना जाता है" <- यह सच नहीं है। यह कुछ सिस्टम पर वैध पृष्ठ पर 0 मानचित्र करने के लिए पूरी तरह वैध (यदि अविश्वसनीय रूप से विघटनकारी है) है। हालांकि, विशेष रूप से सी और सी ++ के मामले में, मानक मांग करता है कि 0 अमान्य सूचक हो, इसलिए मुझे यकीन नहीं है कि यह कैसे इंटरैक्ट करता है। – Promit

+4

मानक यह मांग नहीं करता है कि शून्य एक अमान्य पता है, यह मांग करता है कि जब भी आप शून्य के साथ किसी पते की तुलना करते हैं, तो संकलक को उस शून्य को उस आर्किटेक्चर पर मानक गलत पते में अनुवाद करना होगा। यह थोड़ा संयोग है कि x86 लिनक्स पर अमान्य पृष्ठ भी शून्य है, लेकिन ऐसा नहीं होना चाहिए। – kmm

7

एक सी ++ पृष्ठभूमि शून्य की मानक परिभाषा से आ जब संकेत के बारे में बात 0. है मुझे लगता है होता है कि अन्य भाषाओं इसी तरह काम करते हैं।

+0

यह ज्यादातर भाषाओं में सच है, और केवल सीपीयू/आर्किटेक्चर में ही वास्तव में भिन्न होता है। –

+1

I * अस्पष्ट * याद रखें कि कुछ आर्किटेक्चर (एक पीडीपी संस्करण?) में एक शून्य सूचक था जो * शून्य नहीं था, लेकिन एक स्मृति पते की ओर इशारा किया जो कि dereferencing के लिए समान रूप से अमान्य था। गुगलिंग के बावजूद मुझे यह संदर्भ नहीं मिल रहा है। –

+2

अपने सी ++ कोड में एक नल पॉइंटर के मूल्य को भ्रमित न करें, जो सी ++ मानक के प्रति अनुभाग 4.10/1 के शून्य होना चाहिए, और संकलक का उपयोग करने वाले शून्य सूचक का आंतरिक प्रतिनिधित्व होना चाहिए, जो कि सुविधाजनक हो सकता है। –

8

.NET में, शून्य मानों को "सभी शून्य" बिट पैटर्न द्वारा दर्शाया जाता है।

यह महत्वपूर्ण है, क्योंकि इसका मतलब यह है कि सही ढंग से एक नई सरणी या ऑब्जेक्ट बनाने के लिए मेमोरी को पोंछना शामिल है, जिसमें सभी क्षेत्रों के लिए उपयुक्त डिफ़ॉल्ट मान बनाने के लिए मेमोरी पोंछना शामिल है, जहां कन्स्ट्रक्टर, वैरिएबल स्टार्टिलाइजर्स इत्यादि को उचित रूप से आमंत्रित करना शुरू हो।

+1

Ecma334 में, पी 122 यह कहता है: [नोट: डिफ़ॉल्ट मानों के लिए प्रारंभिक रूप से किया जाता है ... स्मृति को सभी बिट्स-शून्य ... अंत नोट में प्रारंभ करें]। ठेठ क्वालीफायर और [नोट] संदर्भ नोट करें। –

+1

@ हेंक: यह सी # - मैं जानबूझ कर खुद को प्रतिबंधित कर रहा हूं।सी # :) –

+0

जॉन के बजाय नेट, ऐसा लगता है कि एक विशिष्ट भाषा इस में से किसी भी को अलग-अलग लागू कर सकती है। नोट 'मेमोरी मैनेजर' के बारे में है। –

2

कंप्यूटर कैसे बताता है कि संदर्भ किसी ऑब्जेक्ट के संदर्भ के बजाय शून्य है?

Wikipedia के अनुसार, कुछ भाषाओं में नल पॉइंटर स्मृति में एक निश्चित पता है, जो उपयोगकर्ता कार्यक्रमों सकता है नहीं पहुँच है, तो इस पते पर किसी वस्तु अंक हैं, यह शून्य है, अन्यथा, ऐसा नहीं है हो सकता है।

0

http://googleit1st.com/search?hl=en&q=null+pointer

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

3

सभी भाषाएं एक विशेष मूल्य का उपयोग नहीं करती हैं, कभी-कभी शून्य एक वस्तु है। गतिशील भाषाओं में अक्सर एक वैश्विक वस्तु होती है जो शून्य का प्रतिनिधित्व करती है, जब उनके पास कोई मूल्य नहीं है, तो ऑब्जेक्ट संदर्भ सेट किए जाते हैं। इन मामलों में विधि कॉल को शून्य ऑब्जेक्ट और उचित प्रतिक्रियाओं पर बनाया जा सकता है।

उदाहरण के लिए रुबी में एक सिंगलटन है जिसे नील कहा जाता है और सामान्य तरीकों जैसे कि, शून्य? और to_s में सभी उचित डिफ़ॉल्ट कार्यान्वयन होते हैं जिन्हें आप उम्मीद करेंगे कि उन्हें शून्य ऑब्जेक्ट पर कॉल किया गया था।

जावा नल में वर्चुअल मशीन विनिर्देशन में पूरी तरह से निर्दिष्ट किया गया है। इसका वास्तविक मूल्य वास्तव में निर्दिष्ट नहीं है, बल्कि बाइट कोड निर्देश इसे देखते समय क्या होना चाहिए।

नल ऑब्जेक्ट संदर्भ को एक शून्य ऑब्जेक्ट को इंगित करने के लिए सामान्य रूप से "संभाला" होता है। लेकिन कम अवशोषण वाले भाषा शून्य के रूप में शून्य का उपयोग कर सकते हैं जो स्मृति में एक स्थान है, लेकिन एक ऑपरेटिंग सिस्टम प्रोग्राम को वास्तव में लिखने से रोकता है, बल्कि कोर डंपिंग या अन्यथा प्रोग्राम को रोकता है।

4

#

CLR अशक्त के लिए एक opcode है ग के लिए जवाब देने के लिए।

String s = "ff"; 

    s = null; 

इस आईएल

.locals init ([0] string s) 
    IL_0000: nop 
    IL_0001: ldstr  "ff" 
    IL_0006: stloc.0 
    IL_0007: ldnull 
    IL_0008: stloc.0 

के रूप में आप देख सकते हैं उत्पन्न करता है, वहाँ एक ldnull opcode जो अशक्त की विशेष मूल्य

1

रैम के पहले पृष्ठ आमतौर पर उपयोगकर्ता के अंतरिक्ष से सुरक्षित है संभालती है कार्यक्रम। इस तरह यदि कोई प्रोग्रामर नल पॉइंटर की जांच करना भूल जाता है, तो प्रोग्राम कम से कम पेज गलती का कारण बनता है, जब प्रोग्राम उस स्थान तक पहुंचने का प्रयास करता है।

तो [0x00000000], तकनीकी रूप से वास्तविक स्मृति स्थान है, अधिकांश प्रोग्राम इसका उपयोग नहीं कर सकते हैं।

x86 प्रोसेसर के पास एक विशेष टेबल है, अगर मुझे सही याद है।

संबंधित मुद्दे