10

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

4

6 回答 6

20

这是因为来自的输出printf()被缓冲了。你可以fflush(stdout);在你之后立即添加printf它会打印出来。

你也可以这样做:

fprintf(stderr, "error string");

因为stderr没有缓冲。

还有一个相关的问题

于 2009-10-04T03:21:35.063 回答
5

如果在 printf 之后太快出现分段错误,并且输出缓冲区没有被刷新,您将看不到 printf 的效果。

于 2009-10-04T03:21:59.850 回答
5

大多数 libc 实现缓冲 printf 输出。通常将换行符 (\n) 附加到输出字符串以强制它刷新缓冲区内容就足够了。

于 2009-10-04T03:22:35.637 回答
3

您可以在 printf 之后立即刷新输出缓冲区,以确保它会在段错误之前发生。例如。fflush(标准输出)

于 2009-10-04T03:24:34.183 回答
3

随机提示:如果您尝试调试分段错误,请务必尝试valgrind。它使它更容易!

于 2009-10-04T03:29:13.987 回答
0

您已经获得了许多答案,指出了输出流的缓冲。

不管好坏,这远非唯一的可能性。分段错误意味着操作系统检测到您做错了什么,通常写在分配的内存之外。无论好坏(大多数情况下),在这种情况下做几乎任何事情都可以改变程序内部所做的足够多的事情,以防止问题被检测到,至少在之前检测到的时间/情况下是这样。

例如,段错误可能是由写入未初始化的指针引起的——该指针恰好保存了某个值(可能是一些小整数),因为您之前调用的函数将该值留在了堆栈的正确位置当调用后面的函数并使用与指针相同的值时,它(相当可靠)包含操作系统检测为不允许写入的位置的值。但是,调用 printf 可能意味着您在堆栈上的某个位置留下了一些完全不同的值,而这些值是您在没有初始化的情况下使用的。你仍在写你不应该写的地方,但它现在可能是操作系统不知道你不应该写的地方。

于 2009-10-04T04:37:02.413 回答