2009-10-04 20 views
10

मैंने देखा है कि कभी-कभी सी प्रोग्राम में, अगर हमारे पास सेगमेंटेशन गलती से पहले कहीं भी printf कोड है, तो यह प्रिंट नहीं होता है। ऐसा क्यों है?सेगमेंटेशन गलती प्रश्न

+0

मैं अक्सर गैर-मूल अंग्रेजी बोलने वाले वाक्यांशों का उपयोग करता हूं "मुझे संदेह है ..."। मैं मूल अंग्रेजी बोलने वालों को "संदेह" शब्द के अनुचित उपयोग का उपयोग शुरू करने से नफरत करता हूं। – Rob

उत्तर

20

ऐसा इसलिए है क्योंकि printf() से आउटपुट buffered है। आप अपने printf के तुरंत बाद fflush(stdout); जोड़ सकते हैं और यह प्रिंट करेगा।

इसके अलावा, आप ऐसा कर सकता है:

fprintf(stderr, "error string"); 

stderr के बाद से बफ़र नहीं है।

There's also a related question

5

यदि सेगमेंटेशन गलती प्रिंटफ़ के बाद बहुत जल्द होती है, और आउटपुट बफर फ्लश नहीं किया गया था, तो आपको printf का प्रभाव दिखाई नहीं देगा।

5

अधिकांश libc कार्यान्वयन बफर printf आउटपुट। आमतौर पर बफर सामग्री को फ़्लश करने के लिए मजबूर करने के लिए आउटपुट स्ट्रिंग में न्यूलाइन (\ n) को जोड़ने के लिए पर्याप्त होता है।

+3

यह पर्याप्त नहीं होगा। आपको fflush() को कॉल करने की आवश्यकता है; –

+1

जब तक कि यह किसी फ़ाइल पर रीडायरेक्ट नहीं किया जाता है, इस स्थिति में यह लाइन बफरिंग के बजाय अधिक पारंपरिक बफरिंग हो सकता है। –

+0

आह अच्छे अंक, मैंने किसी भी अच्छे कारण के लिए लाइन बफरिंग नहीं की, धन्यवाद। – Falaina

3

प्रिंटफ के बाद आप आउटपुट बफर को फ्लश कर सकते हैं यह सुनिश्चित करने के लिए कि यह एक सीजी गलती से पहले होगा। उदाहरण के लिए। fflush (stdout)

3

यादृच्छिक युक्ति: यदि आप सेगमेंटेशन दोषों को डीबग करने का प्रयास कर रहे हैं, तो valgrind को आजमाएं। यह बहुत आसान बनाता है!

0

आपको आउटपुट स्ट्रीम के बफरिंग को इंगित करने वाले कई उत्तरों दिए गए हैं।

बेहतर या बदतर के लिए, यह कहीं भी एकमात्र संभावना के करीब नहीं है। एक सेगमेंटेशन गलती का मतलब है कि ओएस ने पाया है कि आपने कुछ गलत किया है, आमतौर पर आवंटित स्मृति के बाहर लिखा गया है। बेहतर या बदतर (अधिकतर बदतर) लगभग कुछ ऐसी स्थिति में कुछ भी करने के लिए प्रोग्राम को आंतरिक रूप से समस्या को रोकने के लिए आंतरिक रूप से क्या किया जा सकता है, कम से कम उस समय/उस स्थिति में जहां पहले पता चला था।

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

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