2013-04-09 6 views
10

यहाँ कोड (मान्य C और C++)क्या बाहर निकलने से पहले स्टडआउट ऑटो-फ्लश की गारंटी है? यह कैसे काम करता है?

#include <stdio.h> 

int main() { 
    printf("asfd"); 
    // LINE 1 
    return 0; 
} 

पंक्ति 1 में मैं अभिव्यक्ति कार्यक्रम कुछ भी मुद्रण (उम्मीद के रूप में) के बिना क्रैश segfaulting डाल दिया है।

लेकिन उपरोक्त कोड प्रिंटिंग "asdf" क्यों है और बिना बफर के बाहर निकल रहा है? हुड के नीचे क्या है और यह अपेक्षा के अनुसार क्यों काम करता है?

+0

सी ++ में printf का उपयोग न करें !! –

+1

नोट: यह प्रश्न दोहरी टैग की गई है लेकिन सी ++ की तुलना में उत्तर सी में अलग है। रेमंड चेन के जवाब में सी ++ शामिल हैं। @ जेन्सगस्टेड के उत्तर में सी शामिल है (लेकिन हटा दिया गया है ...) –

उत्तर

17

यह C++ भाषा विनिर्देश में इन दो वर्गों द्वारा पूरा किया है:

[basic.start.main]

main में एक वापसी कथन मुख्य कार्य छोड़ने का प्रभाव पड़ता है और तर्क के रूप में वापसी मूल्य के साथ exit पर कॉल करना।

  • ...
  • :

और

[lib.support.start.term]

समारोह exit इस अंतर्राष्ट्रीय मानक में अतिरिक्त व्यवहार है

  • अगला, सभी खुले सी स्ट्रीम अनचाहे buffered डेटा ar के साथ ई flushed।
  • ...
  • +0

    दिलचस्प है कि प्रक्रियाओं को विस्तारित करना संभव है जो 'बाहर निकलें' प्रदर्शन करता है या इसे अधिभारित करता है। मुझे –

    +4

    @ सशा का प्रयास करना चाहिए।सोचका: आप 'निकास' फ़ंक्शन को अधिभारित नहीं कर सकते; यदि आप कोशिश करते हैं, तो आपका फ़ंक्शन नहीं बुलाया जाएगा। हालांकि, आप ['atexit (3)'] (http://linux.die.net/man/3/atexit) फ़ंक्शन का उपयोग करके बाहर निकलने पर फ़ंक्शंस को पंजीकृत कर सकते हैं। –

    +0

    सवाल पूछता है "हुड के नीचे क्या है?" मैं यह पूछता हूं कि व्यवहार कैसे लागू किया जाता है। यह उत्तर केवल मानक कहानियों को उद्धृत करता है कि इसे लागू किया जाना चाहिए। –

    1

    जब main() निकलता है, तो सभी खुली धाराएं बंद होती हैं ... stdout शामिल करने के लिए। खुली धारा को बंद करना stdout और जो आपने बफर को लिखा है वह नई लाइन के साथ या बिना प्रतिबद्ध हो जाता है।

    2

    आम तौर पर, main से एक वापसी अपने कार्यक्रम के अंत नहीं है और न main शुरू करने के लिए प्रविष्टि है।

    आमतौर पर, आपके प्रोग्राम के लिए अंतिम निष्पादन योग्य लिंकर कुछ स्थान को चिह्नित करता है, शायद start नाम दिया गया है, जहां स्थान निष्पादन शुरू होता है। जब ऑपरेटिंग सिस्टम आपके प्रोग्राम को लोड करता है और इसे निष्पादित करना शुरू करता है, तो यह इस स्थान पर निष्पादन शुरू करता है। वहां एक कोड है जो पर्यावरण स्थापित करता है: एक ढेर बनाता है, स्ट्रीम राज्य सेट करता है, और cetera। फिर यह कोड main पर कॉल करता है।

    जब main रिटर्न देता है, तो यह इस विशेष कोड पर वापस आता है। उस कोड में this answer में वर्णित अनुसार सी या सी ++ प्रोग्राम के अंत में आवश्यक विभिन्न क्लीन-अप कार्य करता है।

    यदि कोई प्रोग्राम अचानक समाप्त हो जाता है, तो यह अंतिम कोड निष्पादित नहीं किया जा सकता है।

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

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