2013-02-26 50 views
7

एक शून्य फ़ंक्शन पॉइंटर को कॉल करने का व्यवहार क्या है?NULL फ़ंक्शन पॉइंटर्स

void (*pFunc)(void) = NULL; 
pFunc(); 

क्यों यह शून्य करने के लिए अभी तक अप्रयुक्त समारोह संकेत प्रारंभ करने की सलाह दी जाती है?

+1

बस एक सामान्य सूचक की तरह, मुझे लगता है कि आपको एक सीगफॉल्ट मिलेगा। – Rerito

+1

http://stackoverflow.com/questions/10014284/what-does-null-function-pointer-in-c-mean – Suri

+1

वे दोनों एक ही प्रश्न के पॉइंटर्स हैं :-) –

उत्तर

7

में C और C++, इस undefined behaviour कहा जाता है, जिसका अर्थ है कि यह एक मामले के आधार पर कारण होगा इस तरह के एक विभाजन गलती, कुछ भी नहीं या जो कुछ भी करने के लिए नेतृत्व कर सकते हैं आपका कंपाइलर, ऑपरेटिंग सिस्टम जिसे आप इस कोड को चला रहे हैं, पर्यावरण (आदि ...) का अर्थ है।

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

+0

अगर अच्छा होगा तो SEGFAULT की गारंटी थी । – Vorac

+1

इससे 99% मामलों में और कई प्रणालियों/आर्किटेक्चर में सेगमेंटेशन गलती हो जाएगी। हालांकि, मानक स्पष्ट रूप से यह नहीं बताता कि यह होगा। –

+0

मुझे लगता है कि यह "अनिर्दिष्ट" व्यवहार है, लेकिन वास्तव में अनिर्धारित नहीं है। क्या होगा यदि स्मृति 0x0 पता योग्य और "निष्पादन योग्य" है ... –

0

यह "सामान्य" (डेटा) पॉइंटर्स को NULL पर प्रारंभ करने के समान कारण के लिए सलाह दी जाती है: क्योंकि यह संभावित रूप से कुछ त्रुटियों को ट्रैक करने में आसान बनाता है। क्या यह उपयोगी है या नहीं पर विचार के पाठ्यक्रम :-) भिन्न हो

1
  1. जब आप नूल तक पहुंचने का प्रयास करते हैं तो क्या खुशी होती है? डेटा के साथ-साथ कोड के बारे में भी सत्य है, और यह होता है जब आप NULL (या 0 से 4096 से कोई पता, यानी सेगमेंट का कम से कम पहला पृष्ठ) पढ़ने का प्रयास करते हैं। इस का मूल कारण ओएस और माइक्रोप्रोसेसर विभाजन/पेजिंग वास्तुकला

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

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

    लिंक: http://en.wikipedia.org/wiki/Page_fault#Invalid http://en.wikipedia.org/wiki/Memory_protection#Paged_virtual_memory http://pdos.csail.mit.edu/6.828/2005/readings/i386/s05_02.htm

    ऊपर bt के रूप में मुझे लगता है कि यू के साथ-साथ http://www.iecc.com/linker/linker04.txt

  2. क्यों समारोह सूचक शून्य पर आरंभ नहीं हो जाता यह पढ़ना चाहिए पर्याप्त है? यद्यपि आप NULL के साथ कॉल करने का प्रयास करते हैं, यह पृष्ठ/सेगमेंट गलती देने जा रहा है। एनयूएलएल अपने अमान्य कार्य को दर्शाता है।यदि यह में कोई कचरा पता है लेकिन कोड अनुभाग के वैध वर्चुअल पता स्थान में, मुझे लगता है कि उस पते पर कोई भी कोड कहा जाएगा, जो और भी आपदा (वास्तविक समय प्रणाली के मामले में विभाजित) हो सकता है। funcp = funct_foo_name + 1 आरंभ करें; अब फ़ंक्शन पॉइंटर का उपयोग करके फ़ंक्शन कॉल करें। फ़ंक्शन पॉइंटर बिंदु वर्चुअल एड्रेस कोड अनुभाग की जगह पर इंगित करता है। निष्पादित करने के लिए बीटी फ़ंक्शन गलत स्थान से शुरू होगा। जिसके परिणामस्वरूप गलत कोड निष्पादन या गलत ऑर्डर हो सकता है।

+1

आप बहुत अधिक धारणाएं बनाते हैं जो जरूरी नहीं हैं। मैंने उन प्लेटफॉर्म पर काम किया है जहां पते 0 का इलाज 428 9 0 से अलग नहीं है। –

+1

[दस आज्ञाएं] (http://www.lysator.liu.se/c/ten-commandments.html) हमें सिखाते हैं, "आप नॉन पॉइंटर का पालन नहीं करेंगे, अराजकता और पागलपन के लिए आप अंत में इंतजार कर रहे हैं।" – vonbrand

+0

@NikBougalis: आप सच हैं। मेरा पहला पृष्ठ या अमान्य पता श्रेणी 0 से 4096 (जो x386 का मानक पृष्ठ आकार है) का मतलब है, वह आंतरिक अमान्य वर्चुअल एड्रेस स्पेस है। जैसा कि मुझे लगता है कि यह एक ओएस निर्भर सामान है, वर्चुअल एड्रेस स्पेस रेंज का प्रारंभिक भाग कितना अमान्य लगता है –

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

  • कोई संबंधित समस्या नहीं^_^