2010-05-04 18 views
11

सी पॉइंटर्स here पर नौकरी साक्षात्कार के प्रश्नों में से एक निम्न है: शून्य सूचक असाइनमेंट त्रुटि क्या है?"शून्य सूचक असाइनमेंट त्रुटि" क्या है?

मैंने थोड़ी देर के लिए googled किया है और कोई उचित स्पष्टीकरण नहीं देखते हैं। वो क्या है? एक शून्य सूचक के माध्यम से लिखने की कोशिश कर रहा है? कुछ वास्तुकला- या पर्यावरण-विशिष्ट? वह त्रुटि वास्तव में क्या है?

+1

http://www.faqs.org/qa/qa-3786.html – zaf

उत्तर

19

http://www.faqs.org/qa/qa-3786.html

एक शून्य सूचक काम एक रनटाइम त्रुटि यह विभिन्न कारणों की वजह से होता है एक है कि अपने कार्यक्रम एक अवैध स्मृति स्थान का उपयोग करने की कोशिश की है है। अवैध स्थान का अर्थ है या तो स्थान ऑपरेटिंग सिस्टम एड्रेस स्पेस या अन्य प्रक्रिया मेमोरी स्पेस में है। stdio.h में NULL कोके रूप में परिभाषित किया गया है, इसलिए जब भी आपका प्रोग्राम 0 वें स्थान तक पहुंचने का प्रयास करता है तो ऑपरेटिंग सिस्टम रनटाइम असाइनमेंट त्रुटि के साथ आपके प्रोग्राम को मारता है क्योंकि 0 वां स्थान ऑपरेटिंग सिस्टम एड्रेस स्पेस में होता है और ऑपरेटिंग सिस्टम तक पहुंच की अनुमति नहीं देता है उपयोगकर्ता कार्यक्रम द्वारा इसकी पता स्थान।

उदाहरण कोड:

int* ptr = NULL; 
*ptr = 3; 

स्पष्टीकरण:
लगभग हर प्रणाली पर, पता 0 आरक्षित है। सिस्टम आपको उस स्थान पर लिखने की अनुमति नहीं देगा। यदि आप कोशिश करते हैं, तो आपको रनटाइम अपवाद मिलेगा (प्रवेश उल्लंघन, segmentation fault, आदि)।

+0

मैंने इसे देखा है। क्या यह सही है? क्या यह सिर्फ एक शून्य सूचक के माध्यम से लिखने के लिए उबालता है? – sharptooth

+0

हां। चूंकि त्रुटि का नाम सुझाता है ("नल पॉइंटर असाइनमेंट त्रुटि"), जब आप पॉइंटर को मान (पता नहीं) असाइन करने का प्रयास करते हैं तो इसे फेंक दिया जाता है, जिसे न्यूल में प्रारंभ किया गया है। (लेकिन शून्य आवश्यक नहीं है (हालांकि लगभग हमेशा होता है), जैसा कि विकी द्वारा इंगित किया गया है: http://en.wikipedia.org/wiki/Pointer_(computing)#Null_pointer) – Paya

0

ऐसे कई परिदृश्य हैं जहां आप समस्याएं देख सकते हैं। लेकिन महत्वपूर्ण बात यह है कि आपने स्मृति को सही ढंग से आवंटित नहीं किया था। प्रोग्राम चलाने के बाद निम्न कोड नल पॉइंटर असाइनमेंट त्रुटि संदेश उत्पन्न करेगा। नोट: यह सही ढंग से संकलित होगा।

void CopyMessage(char *p) 
{ 
    strcpy(p, "welcome"); 
} 

void main() 
{ 
    char *src; 
    CopyMessage(src); 
} 
+0

यह gcc के साथ संकलित होने पर ऐसा संदेश उत्पन्न नहीं करता है -4.3.4 ideone.com – sharptooth

1

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

चलिए टीसी कंपाइलर के मामले पर विचार करते हैं, यह कंपाइलर डेटा सेगमेंट और टीसी कॉपीराइट नोटिस के नीचे चार शून्य बाइट्स रखता है। टीसी भी डीएस: 0000 स्थान, डेटा सेगमेंट के नीचे शून्य पॉइंटर्स स्थान के रूप में उपयोग करता है। इसलिए, इस शून्य सूचक को मान निर्दिष्ट करने से, चार बाइट्स को वास्तव में बदल दिया जाएगा और शायद, कॉपीराइट नोटिस को गड़बड़ कर दें।

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

तो, मुझे लगता है कि यह सिर्फ शून्य सूचक नहीं है, किसी भी सूचक जो जंगली हो जाता है, अगर कुछ महत्वपूर्ण क्षेत्रों तक पहुंचने का प्रयास करता है, तो आपको नल पॉइंटर असाइनमेंट त्रुटि से स्वागत किया जाता है।

0

यह एक रन टाइम त्रुटि तब होती है जब आप अवैध मेमोरी स्पेस को इंगित करने का प्रयास करते हैं, आमतौर पर ओएस के लिए आरक्षित 0 को संबोधित करते हैं।

-2

2017-10-27: पुनर्लेखन

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

इस प्रकार की त्रुटि (अपरिभाषित, या शून्य) बहुत दुर्लभ है। लेकिन आधुनिक प्रोग्रामिंग, एक चिप प्रोग्रामिंग पर एक आर्डिनो, रास्पबेरी पीआई, एएमडी, या किसी अन्य कंप्यूटर जैसे बैंचटॉप उपकरणों का उपयोग करते हुए, असंख्य रूपों में मौजूद हैं, जिनमें से कई आज के रूप में सरल हैं, यह समस्या आज भी मौजूद है और यहां तक ​​कि हो सकती है सिस्टम के सबसे परिष्कृत में। इसके अतिरिक्त, कंपनियां जो अपने स्वयं के चर या डेटा संरचनाओं का निर्माण करती हैं, वे शायद आज भी इसे देखने के लिए सबसे अधिक संभावना वाले लोग हैं। इरादा उन उदाहरणों को दिखाना है जो पहचान में सहायता कर सकते हैं।

इसके लिए 'शून्य' सूचक त्रुटि होने के लिए, असाइन किए गए मान को केवल '0' या 'शून्य' होना चाहिए। लेकिन इसे ऐतिहासिक रूप से 'शून्य सूचक त्रुटि' कहा जाता है न केवल एक साधारण शून्य संकेतक; लेकिन एक सरणी को साफ़ करने या शून्य करने पर उनकी घटना के कारण, दिनचर्या इतनी ओवरहूट कर रही है या सरणी की सीमाओं को अंडरशूट कर रही है। हालांकि, यह सरणी सीमा miscalculations द्वारा बनाई गई एक त्रुटि है जो शून्य सूचक असाइनमेंट और अन्य त्रुटियों का उत्पादन कर सकती है। इन्हें अक्सर आसानी से नहीं पहचाना जाता है और यह तुरंत या बिल्कुल त्रुटि उत्पन्न नहीं कर सकता है, क्योंकि जब पता लगाया गया है कि पॉइंटर मूल रूप से परिभाषित किए जाने पर इंगित किया गया है और अब एक अवांछनीय मान (एक बुरा पता) है। और जब, और जिसे ओवरराइट किया गया था, उसे ढूंढना लगभग असंभव हो सकता है। इसे त्रुटि के प्रकारों की परिभाषा के हिस्से के रूप में शामिल किया गया है जो शून्य पॉइंटर्स उत्पन्न करते हैं। जहां पॉइंटर को शून्य या शून्य के साथ अधिलेखित किया जाएगा और यह एक त्रुटि उत्पन्न करेगा, और इसे संशोधित करने की समस्या के साथ एक छोड़ दिया गया है। यह सुनिश्चित करने के लिए अतिरिक्त देखभाल की जानी चाहिए कि इंडेक्स की गणना बेस विकल्प 0 या 1 के उचित विचार के साथ ठीक से की जाती है और डेटा ब्लॉक को स्थानांतरित करते समय सही ढंग से गणना भी की जाती है। सौभाग्य से कई परिष्कृत विकास सॉफ्टवेयर अनुप्रयोग और उच्च स्तरीय भाषाएं संकलन से पहले या उसके दौरान इन मुद्दों में से बहुत से मुद्दों को पकड़ सकती हैं, जब वेरिएबल सरणी प्रकार स्पष्ट रूप से डाला जाता है, या जब प्रोग्राम रनटाइम वातावरण में लिखा जा सकता है और सरणी सीमाओं पर नज़र रखता है।

एक शून्य सूचक, जैसा कि पुराने दिनों में परिभाषित किया गया था, किसी भी चर जो पॉइंटर के पते और सूचक के पते की पता सामग्री के रूप में उपयोग किया जाता है, जिसका अर्थ सूचक पॉइंट को इंगित करता है, न कि स्थान जो इंगित करता है, शून्य है या शून्य, या संशोधित किया गया है, प्रोग्रामर के इरादे या ज्ञान के बिना अधिलेखित, जो एक शून्य हो सकता है, लेकिन कोई अन्य मूल्य हो सकता है। प्रायः केवल शून्य सूचक एक त्रुटि संदेश बनाता है, भले ही कोड एक त्रुटि उत्पन्न कर सके, क्योंकि यह अक्सर गलत स्थानों पर लिखे गए नल वाले डेटा के ब्लॉक होते हैं। मूल परिभाषित पते को इंगित करने के बजाय जहां डेटा रहना चाहिए, अब इसमें एक अमान्य या अवांछित पता चलाना डेटा अमान्य या अवांछित स्थान ओवरराइटिंग और कोड या डेटा को दूषित कर रहा है। चूंकि डेटा की विफलता, या कोड तुरंत निष्पादित नहीं हो सकता है, या इसे उपयोग नहीं किया जा सकता है क्योंकि यह किसी मौजूदा अप्रयुक्त स्मृति स्थान पर स्थानांतरित हो जाता है, जब कोड या डेटा किसी भी समय चलने में समस्या का कारण बनता है, तो कोई जानकारी नहीं हो सकती त्रुटि के 'वास्तविक' स्थान पर, चाहे वह शून्य पॉइंटर्स या अन्य भ्रष्टाचार को बनाता या निर्दिष्ट करता है, यह कोड को संशोधित करता है, और चीजें अजीब, वास्तव में अजीब हो सकती हैं।

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

सरल वास्तुकला या प्रोग्रामिंग वातावरण में, यह किसी भी कोड है जो अनजाने में संकेत के रूप में nulls बनाने समाप्त होता है, या एक बग है कि किसी भी तरह निष्पादन रुकती है,, वापसी ढेर में एक बाइट अधिलेखन कोड अधिलेखन की तरह बनाता है का उल्लेख कर सकते डाल गलत स्थान पर कोड या डेटा, न कि पते के रूप में। इसलिए, उपरोक्त उदाहरणों के दौरान, एक शून्य सूचक के उदाहरण को परिभाषित करने के लिए ठीक काम करें। इसलिए हम अवधारणा का विस्तार करते हैं, एक नल पॉइंटर कोई पॉइंटर होता है जो एक परिवर्तनीय सूचक के रूप में उपयोग किया जाता है, और उस चर के पते स्थान को कई कारणों में से किसी एक के लिए अब 'शून्य' या कोई अनपेक्षित मान होता है जो अवांछित स्मृति स्थान को इंगित करता है कोई फर्क नहीं पड़ता कि यह कैसे मिला।

तो आखिर में, कोई एक शून्य सूचक त्रुटि प्राप्त कर सकता है, और पॉइंटर की जांच करने पर यह एक शून्य है; लेकिन, उस कोड को नहीं मिला जो शून्य में पॉइंटर में रखता है या इसे सौंपा गया है। यह शून्य सूचक असाइनमेंट त्रुटि की एक विस्तृत परिभाषा है, और एक शून्य सूचक त्रुटि का सबसे खराब स्थिति परिदृश्य है। जब यह एक बड़े कार्यक्रम में होता है, तो यह प्रोग्राम की मौत हो सकता है क्योंकि यदि त्रुटि पहले मौजूद थी, और गलत स्मृति स्थान पर लिख रही थी, और उस स्थान को अभी तक आवंटित नहीं किया गया था, तब तक प्रोग्राम अनदेखा हो जाता है जब तक कि प्रोग्राम का विस्तार नहीं हो जाता , और अब गलत स्मृति स्थान नए कोड के अंदर मौजूद हो सकता है, जो यादृच्छिक त्रुटियों को उत्पन्न करता है। उदाहरण के लिए: खराब पता मान डेटा को वैरिएबल स्पेस के बाहर लिखा जाने का कारण बनता है, लेकिन कुछ समय के लिए अनजान हो जाता है क्योंकि यह लिखा जा रहा है, और इसे पढ़ा जा रहा है, और सबकुछ 'ठीक दिखाई देता है' ठीक है! लेकिन, कार्यक्रम फैलता है, बड़ा हो जाता है, एक ही पता स्थान में नया कोड मौजूद होता है, जहां स्मृति पुरानी बग मौजूद होती है जो गलत पता स्थान पर डेटा लिखती है और कोई भी ध्यान नहीं देता है, चाहे एक बाइट, या डेटा का एक संपूर्ण ब्लॉक! लेकिन, अब, वहां नया कोड है। और यह पुराने अनदेखा बग द्वारा दूषित हो गया है, और एक वर्ष पहले मौजूद त्रुटि को खोजने के लिए अब लगभग पूरी तरह से, असंभव नहीं है, लगभग असंभव है। प्रशासक तर्क आमतौर पर निर्देशित करता है, वहां क्यों दिखता है, यह भाग गया और पिछले साल ठीक काम करता था। लेकिन, अब, कुछ भी काम नहीं करता है, प्रमुख टुकड़े टूट जाते हैं, देखो और देखो और आपको कुछ भी नहीं मिलता है। ऐसा लगता है कि त्रुटि मौजूद नहीं है, और फिर भी यह करता है। इसका क्या कारण है, जो पहले लिखित कोड संदिग्ध हैं? नल पॉइंटर्स और कई अन्य त्रुटियां भी इसके कारण होती हैं।

शायद यह उत्तर गलत है और कहीं और सूचीबद्ध होने के लिए बेहतर सेवा प्रदान करेगा। संचालक? शायद, चिंता है क्योंकि इस 'उत्तर' को उचित नहीं माना जाता है क्योंकि प्रश्न में "असाइनमेंट" शब्द के उपयोग पर कुछ चिंता है, जिसका अर्थ जानबूझकर असाइन किया गया है। हालांकि, असाइनमेंट की अवधारणा को ज्ञान या सहमति की आवश्यकता नहीं है। एक एल्गोरिदम या कोड मान असाइन कर सकते हैं। नल पॉइंटर्स को कई तरीकों से बनाया जा सकता है, उदाहरण यहां पारंपरिक त्रुटियों के बाहर सबसे आम है।

ऐसा लगता है कि इस जानकारी में 'ए' जगह है, और इसे यहां एक उत्तर के रूप में शामिल किया गया है। एक साधारण नीचे वोट के बजाय सकारात्मक उपयोगी प्रतिक्रिया या सुझावों की सराहना की जाती है, अगर कोई टिप्पणी करने की परवाह करता है, तो शायद मेटा चर्चा क्रम में है?

चीयर्स।

+0

पर मैं देख सकता हूं कि यह क्यों चिह्नित किया गया था ... यह निश्चित रूप से अस्पष्ट है ... मैं तुरंत इसे संशोधित कर दूंगा। – Cyberchipz

+0

मान लीजिए कि मैं दूसरी बार साफ़ नहीं था ... पुनः प्रयास करें। – Cyberchipz

+0

एक टिप्पणी के बारे में .. टीएलडीआर? – Cyberchipz

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