2010-04-21 18 views
23

उदाहरण के लिए जब हम कहते हैं, एक रिकर्सिव फ़ंक्शन, लगातार कॉल स्टैक में संग्रहीत होते हैं। हालांकि, अगर त्रुटि असीमित रूप से होती है तो त्रुटि 'सेगमेंटेशन गलती' होती है (जैसा कि जीसीसी पर देखा गया है)।सेगमेंटेशन गलती और स्टैक ओवरफ़्लो के बीच क्या अंतर है?

क्या यह 'स्टैक-ओवरफ्लो' नहीं होना चाहिए? फिर दोनों के बीच बुनियादी अंतर क्या है?

बीटीडब्ल्यू, एक स्पष्टीकरण विकिपीडिया लिंक से अधिक सहायक होगा (इसके माध्यम से चला गया है, लेकिन विशिष्ट क्वेरी का कोई जवाब नहीं है)।

+4

ओवरफ्लो सामान प्रोग्रामिंग प्रश्नों के बारे में है, दोष सामग्री सर्वर के बारे में है। ओओ –

+2

@ पावेल: एसआईजीएसईजीवी को सर्वर के साथ क्या करना है? यद्यपि सर्वर अनुप्रयोग एक सेगमेंटेशन गलती का कारण बन सकते हैं, लेकिन वास्तव में सर्वर प्रशासन और प्रोग्रामिंग के साथ सबकुछ करने के लिए कुछ भी नहीं है। –

+5

@ जॉर्ज: http://serverfault.com/ और जोश। – kennytm

उत्तर

51

स्टैक ओवरफ़्लो है [ए] कारण, सेगमेंटेशन गलती परिणाम है।


कम से कम 86 और एआरएम पर, "ढेर" स्मृति का एक टुकड़ा स्थानीय चर रखने और फ़ंक्शन कॉल के पते लौटने के लिए आरक्षित है। जब ढेर समाप्त हो जाता है, आरक्षित क्षेत्र के बाहर की स्मृति का उपयोग किया जाएगा। लेकिन ऐप ने इस स्मृति के लिए कर्नेल से नहीं पूछा, इस प्रकार स्मृति सुरक्षा के लिए एक सेगफॉल्ट उत्पन्न किया जाएगा।

3

कॉल स्टैक ओवरफ़्लो हो रहा है, हालांकि ओवरफ्लोइंग का नतीजा यह है कि अंततः कॉल से संबंधित मान स्मृति में धकेल जाते हैं जो ढेर का हिस्सा नहीं है और फिर - SIGSEGV!

3

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

स्टैक ओवरफ़्लो के दौरान, आप अपने सेगमेंट में आवंटित सभी जगहों को निकालें, और फिर आपका प्रोग्राम सेगमेंट में लिखना शुरू कर देता है कि मेमोरी मैनेजर अनुमति नहीं देता है, और फिर आपको सेगमेंटेशन गलती मिलती है।

+1

बहुत यकीन है कि यूनिक्स ने इस शब्द का उपयोग x86 के करीब कहीं भी किया था ... – SamB

+2

@SamB मुझे नहीं पता कि उत्तर अन्यथा कहां दावा करता है। "X86 मेमोरी मैनेजर में कई विरासत विशेषताएं हैं, जिनमें से एक विभाजन है"! = "X86 ने विभाजन का आविष्कार किया"। – JBentley

+2

x86 (सेगमेंट रजिस्टर्स) द्वारा उपयोग किया गया सेगमेंटेशन ऑपरेटिंग सिस्टम द्वारा किए गए पता स्थान के "सेगमेंटेशन" से बिल्कुल अलग है। सेगमेंटेशन फॉल्ट से सेगमेंट रजिस्टरों के साथ कुछ लेना देना नहीं है। साथ ही, लंबे समय तक x86 का हिस्सा भाग, सेगमेंट रजिस्ट्रार अभी भी वास्तव में महत्वपूर्ण हैं कि x86 आधुनिक ऑपरेटिंग सिस्टम में कैसे काम करता है। – SoapBox

2

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

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