2013-06-12 9 views
7
#include <iostream> 

int main() 
{ 
    int* i = 0; 
    int x = (*i); 
    std::cout << x; 
} 

उपरोक्त कार्यक्रम जब मैं संकलन दुर्घटना और Visual Studio 2010 का उपयोग कर इसे चलाने के लिए और मैं जानता हूँ कि यह दुर्घटनाओं क्योंकि मैं 0.एक अशक्त सूचक का उपयोग करने का प्रयास कर

सूचक मैं जानना चाहूंगा क्या सेट हो जाएगा, है मानक में परिभाषित सी ++ में null pointer तक पहुंचना या यह अनिर्धारित है और मुझे भाग्यशाली लगता है कि मेरा प्रोग्राम मेरे कंपाइलर/कंप्यूटर/ऑपरेटिंग सिस्टम

यदि यह परिभाषित किया गया है, तो सी ++ मुझे कब गारंटी देता है और एक शून्य सूचक का उपयोग करें?

+3

यह अनिर्धारित है। –

+1

@ आर। मार्टिन्हो फर्नांडीस तो मैं उम्मीद कर सकता हूं कि कुछ कंप्यूटरों पर यह क्रैश नहीं होगा? – Caesar

+1

हां, लेकिन आप अन्य लोगों पर अपने हार्डड्राइव को प्रारूपित करने की भी उम्मीद कर सकते हैं – Laurijssen

उत्तर

8

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

2

आपकी प्रक्रिया को यहां क्रैश करने का क्या कारण है ओएस आपके प्रोग्राम को स्मृति के साथ झुकाव से रोक रहा है, इसकी पहुंच (पता 0 पर) तक नहीं है। विंडोज आपको "प्रवेश उल्लंघन" देगा, लिनक्स/यूनिक्स आपको "सेगमेंटेशन गलती" देगा।

इसके अलावा, क्या एक अशक्त सूचक में है की एक बोली के लिए Why are NULL pointers defined differently in C and C++? देखना मानक

2

यह सी में परिभाषित किया गया है नहीं ++ तो यह कुछ ऑपरेटिंग सिस्टम पर दुर्घटना नहीं हो सकता है, लेकिन आप वर्तमान के तहत एक दुर्घटना पर भरोसा कर सकते (और पिछले) विंडोज और लिनक्स के संस्करण क्योंकि उनमें से कोई भी आपको (उपयोगकर्ता प्रक्रिया के रूप में) उस स्मृति स्थान तक पहुंचने देगा।

इसके अलावा, यदि आप प्रोग्राम ब्रेक करना चाहते हैं, तो विंडोज के तहत, डीबगब्रैक(); जो एक अपवाद का कारण बनता है (एमएसडीएन का कहना है: वर्तमान प्रक्रिया में होने वाले ब्रेकपॉइंट अपवाद का कारण बनता है। यह कॉलिंग थ्रेड को अपवाद को संभालने के लिए डीबगर को सिग्नल करने की अनुमति देता है।)

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