我观察到有时在C程序中,如果我们有一个分段故障之前的任何地方在代码printf,它不打印。为什么会这样?

有帮助吗?

解决方案

这是因为从printf()的输出进行缓冲。您可以将您的fflush(stdout);后立即添加printf,它将打印。

您也可以做到这一点:

fprintf(stderr, "error string");

因为stderr没有被缓冲。

还有一个相关的问题

其他提示

如果一个printf后太快发生段错误,和输出缓冲器被未刷新,就不会看到的printf的效果。

大多数的libc实现缓冲printf的输出。它通常是足够的追加换行符(\ n),以输出字符串,迫使它冲洗缓冲器的内容。

可以在printf的后右刷新输出缓冲区以确保它将一个SEG故障之前发生。例如。 fflush(stdout中)

随机提示:如果你想调试段错误,一定要尝试的valgrind 。这使得它更容易!

您已被赋予了编号指出输出流的缓冲答案。

是好还是坏,这是无处接近唯一的可能性虽然。分割故障意味着OS检测到您做错了什么,通常写出来外面分配的内存。为了更好或更差(主要是更糟)做差不多的任何的在这种情况下可以改变足够的程序在内部确实防止问题被发现,至少在时间/的情况下它是什么先前检测到。

例如,段故障可能已经造成通过未初始化的指针写入 - 正巧保持一定值(可能是一些小的整数),因为您先前调用的函数在合适的点上离开的值当后来调用函数,并使用相同的值作为一个指针栈,它(相当可靠)包含检测为你不准写一个地方的OS的值。在对printf一个电话把,不过,可能意味着你在你使用没有初始化的堆栈当场留下了一些完全不同的价值。你还在写的地方,你不应该,但现在它可能是某处OS不的知道的你不应该写。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top