Question

Je l'ai observé que, parfois, dans les programmes C, si nous avons un printf dans le code où avant une erreur de segmentation, il n'imprime pas. Pourquoi est-ce donc?

Était-ce utile?

La solution

Il est parce que la sortie de printf() est tamponne. Vous pouvez ajouter fflush(stdout); immédiatement après votre printf et imprimiez.

Vous pouvez également faire ceci:

fprintf(stderr, "error string");

depuis stderr ne tamponne.

Il y a aussi une question connexe.

Autres conseils

Si le défaut de segmentation se produit trop tôt après une printf, et le tampon de sortie n'a pas été vidé, vous ne verrez pas l'effet de la printf.

La plupart des implémentations libc sortie printf tampon. Il est généralement suffisant pour ajouter saut de ligne (\ n) à la chaîne de sortie pour le forcer à vider le contenu des tampons.

Vous pouvez vider la mémoire tampon de sortie juste après le printf à faire en sorte que cela se produira avant un défaut de SEG. Par exemple. fflush (stdout)

Random Astuce: si vous essayez de débogage des erreurs de segmentation, assurez-vous d'essayer valgrind . Il est beaucoup plus facile!

Vous avez reçu un certain nombre de réponses pointant sur mémoire tampon du flux de sortie.

Pour le meilleur ou le pire, qui est encore loin de la seule possibilité que. Une erreur de segmentation signifie que le système d'exploitation a détecté que vous avez fait quelque chose de mal, généralement écrit en dehors de la mémoire allouée. Pour le meilleur ou le pire (le plus souvent pire) faisant presque quoi que ce soit dans une telle situation peut changer assez de ce que le programme fait en interne pour éviter que le problème ne soit détecté, au moins au moment / dans la situation où il a été détectée précédemment.

Par exemple, le défaut de segment peut avoir été causé par écrit, par un pointeur non initialisé - qui est arrivé à maintenir une certaine valeur (peut-être un petit entier) parce qu'une fonction avait appelé précédemment laissé cette valeur au bon endroit sur la pile que lorsque la fonction a été appelée plus tard, et a utilisé cette même valeur en tant que pointeur, il (raisonnablement fiable) contenait une valeur du système d'exploitation détecté comme un endroit où vous étiez pas autorisé à écrire. Mettre dans un appel à printf, cependant, pourrait signifier que vous êtes en laissant une valeur tout à fait différente à l'endroit sur la pile que vous utilisez sans initialisation. Vous écrivez encore quelque part vous ne devriez pas, mais il pourrait maintenant être quelque part que le système d'exploitation ne pas sais vous ne devriez pas être écrit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top