2013-04-09 14 views
10

Oto kod (obowiązuje C i C++)Czy istnieje gwarancja automatycznego wypłukiwania przed wyjściem? Jak to działa?

#include <stdio.h> 

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

Jeśli w wierszu 1 kładę segfaulting wyraz program będzie tylko katastrofy bez drukowania niczego (zgodnie z oczekiwaniami).

Ale dlaczego powyższy kod drukuje "asdf", a nie wychodzi bez opróżniania bufora? Co kryje się pod maską i dlaczego działa zgodnie z oczekiwaniami?

+0

Nie używaj printf w C++! –

+1

Uwaga: to pytanie jest podwójne, ale odpowiedź jest inna w C niż w C++. Odpowiedź Raymonda Chena obejmuje C++. @JensGustedt odpowiedzi obejmuje C (ale został usunięty ...) –

Odpowiedz

17

Osiąga się to przez te dwie sekcje w specyfikacji język C++

[basic.start.main]

Oświadczenie powrót w main powoduje odejścia główną funkcję, a wywołanie exit z wartością zwracaną jako argumentem.

i

[lib.support.start.term]

Funkcja exit ma dodatkowy problem w niniejszej normie międzynarodowej:

  • ...
  • Następnie wszystkie otwarte strumienie C z niepisanymi buforowanymi danymi ar e spłukane.
  • ...
+0

Interesujące, jeśli możliwe jest rozszerzenie procedur, które 'exit' wykonuje lub nawet przeładować. Powinienem spróbować –

+4

@sasha.sochka: Nie możesz przeciążyć funkcji 'exit'; jeśli spróbujesz, twoja funkcja nie zostanie wywołana. Można jednak rejestrować funkcje, które będą wywoływane przy wyjściu za pomocą funkcji ['atexit (3)'] (http://linux.die.net/man/3/atexit). –

+0

Pytanie zadaje pytanie "Co kryje się pod maską?" Rozumiem to jako pytanie, w jaki sposób zaimplementowano to zachowanie. Ta odpowiedź jedynie przytacza standard, mówiąc, że musi zostać wdrożona. –

1

Po zamknięciu wszystkich otwartych strumieni main() ... Zamknięcie otwartego strumienia powoduje przepełnienie stdout, a to, co napisałeś do bufora, zostanie zatwierdzone z nowym znakiem lub bez niego.

2

Generalnie, powrót z main nie jest koniec programu, ani nie jest wejście do main początku.

Zwykle linker, który tworzy ostateczny plik wykonywalny dla twojego programu, zaznacza pewną lokalizację, być może nazwaną start, jako miejsce rozpoczęcia egzekucji. Kiedy system operacyjny załaduje twój program i zacznie go wykonywać, rozpocznie wykonywanie w tym miejscu. Jest tam kod, który tworzy otoczenie: Tworzy stos, ustawia stany strumieni i tak dalej. Następnie ten kod wywołuje main.

Po powrocie main wraca do tego specjalnego kodu. Kod ten następnie wykonuje różne prace porządkowe, które są wymagane na końcu programu C lub C++, jak opisano w this answer.

Jeśli program zostanie nagle przerwany, ten ostatni kod może nie zostać wykonany.

Powiązane problemy