2013-04-09 9 views
10

Ecco il codice (valido C e C++)Esiste una garanzia per lo svuotamento automatico dello stdout prima dell'uscita? Come funziona?

#include <stdio.h> 

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

Se in linea 1 ho messo va in segfault espressione del programma sarebbe appena in crash senza stampare nulla (come previsto).

Ma perché il codice sopra riportato stampa "asdf" e non esce senza che il buffer venga svuotato? Cosa è sotto il cofano e perché funziona come previsto?

+0

Non utilizzare printf in C++ !! –

+1

nota: questa domanda è a doppio tag ma la risposta è diversa in C che in C++. La risposta di Raymond Chen copre il C++. La risposta di @JensGustedt copre C (ma è stata cancellata ...) –

risposta

17

Questo si ottiene queste due sezioni del linguaggio C++ specifica:

[basic.start.main]

Una dichiarazione di ritorno nel main ha l'effetto di lasciare la funzione principale e chiamando exit con il valore restituito come argomento.

e

[lib.support.start.term]

La funzione exit ha un comportamento aggiuntivo nella presente norma internazionale:

  • ...
  • Successivamente, tutti i flussi C aperti con dati buffer non scritti ar e arrossì.
  • ...
+0

Interessante se è possibile estendere le procedure che "escono" le esegue o addirittura la sovraccaricano. Dovrei provare –

+4

@sasha.sochka: non puoi sovraccaricare la funzione 'exit'; se ci provi, la tua funzione non verrà chiamata. Puoi, tuttavia, registrare le funzioni da richiamare all'uscita usando la funzione ['atexit (3)'] (http://linux.die.net/man/3/atexit). –

+0

La domanda chiede "Cosa c'è sotto il cofano?" Interpreto questo chiedendo come viene implementato il comportamento. Questa risposta cita semplicemente la frase standard che deve essere implementata. –

1

Quando si esce da main(), tutti gli stream aperti sono chiusi ... per includere stdout. La chiusura del flusso aperto svuota stdout e ciò che è stato scritto sul buffer viene eseguito con o senza la nuova riga.

2

In generale, un ritorno da main non è la fine del programma, né è l'ingresso al main l'inizio.

In genere, il linker che crea l'eseguibile finale per il programma contrassegna una posizione, forse denominata start, come il luogo in cui deve iniziare l'esecuzione. Quando il sistema operativo carica il programma e inizia a eseguirlo, inizia l'esecuzione in questo punto. Esiste un codice che crea un ambiente: crea uno stack, imposta stati del flusso, eccetera. Quindi questo codice chiama main.

Quando restituisce main, si torna a questo codice speciale. Tale codice esegue quindi vari lavori di pulizia richiesti alla fine di un programma C o C++, come descritto in this answer.

Se un programma viene interrotto bruscamente, questo codice finale potrebbe non essere eseguito.

Problemi correlati