Frage

Ich habe beobachtet, dass manchmal in C-Programmen, wenn wir einen printf in Code an beliebiger Stelle vor einem Segmentierungsfehler haben, ist es nicht drucken. Warum ist das so?

War es hilfreich?

Lösung

Es ist, weil die Ausgabe von printf() gepuffert. Sie könnten fflush(stdout); sofort nach printf hinzufügen und es würde drucken.

Auch Sie könnten dies tun:

fprintf(stderr, "error string");

da stderr nicht gepuffert.

Es gibt auch eine damit verbundene Frage .

Andere Tipps

Wenn die Segmentierungsfehler treten zu früh nach einem printf, und der Ausgangspuffer nicht geleert wurde, werden Sie nicht die Wirkung des printf sehen.

Die meisten libc Implementierungen printf Ausgabe puffern. Es ist in der Regel ausreichend Newline anhängen (\ n) mit dem Ausgang Zeichenkette, die es zu zwingen, den Puffer Inhalt zu spülen.

Sie können den Ausgabepuffer spülen direkt nach der printf, um sicherzustellen, dass sie vor einem seg Fehler auftreten. Z.B. fflush (stdout)

Random Tipp: Wenn Sie debuggen Segmentation Faults sind versuchen, sollten Sie valgrind versuchen. Es macht es viel einfacher!

Sie haben eine Reihe von Antworten gegeben worden Hinweis auf den Ausgabestrom Pufferung von.

Für besser oder schlechter, die allerdings auf die einzige Möglichkeit, nirgendwo in der Nähe ist. Ein Segmentierungsfehler bedeutet, dass das Betriebssystem erkannt hat, dass man etwas falsch gemacht, in der Regel geschrieben außen aus zugewiesenen Speichern hat. Für besser oder schlechter (meist schlechter) fast etwas zu tun in einer solchen Situation kann genug ändern, was intern das Programm macht, das Problem zu verhindern, dass zu der Zeit / in der Situation, zumindest festgestellt werden, wo es zuvor erfasst wurde.

Zum Beispiel kann das Segment Fehler durch das Schreiben durch einen nicht initialisierten Zeiger verursacht wurden - die einen bestimmten Wert zu halten passiert ist (vielleicht einige kleine ganze Zahl ist), weil eine Funktion, die Sie vorher diesen Wert an der richtigen Stelle links angerufen hatte auf der Stapel, dass, wenn die spätere Funktion aufgerufen wurde, und dass gleichen Wert als Zeiger verwendet wird, es (einigermaßen zuverlässig) enthielt einen Wert das O als Ort erkannt Sie schreiben nicht erlaubt waren. Putting in einem Aufruf von printf, könnte aber meinen Sie an der Stelle auf dem Stack etwas ganz anderen Wert gehen, dass Sie ohne Initialisierung verwenden. Du bist immer noch irgendwo zu schreiben, sollten Sie nicht, aber es könnte jetzt irgendwo sein, dass das Betriebssystem nicht funktioniert weiß Sie nicht schriftlich sein sollten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top