2009-10-04 139 views
10

我注意到有时在C程序中,如果我们在分割错误之前的任何位置有代码printf,它不会打印。这是为什么?分割错误问题

+0

我经常看到非母语英语的用户使用“我对...有怀疑”这个短语。我不希望看到母语为英语的人开始使用“怀疑”这个词的不恰当用法。 – Rob 2010-02-16 03:44:17

回答

20

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

也可以这样做:

fprintf(stderr, "error string"); 

因为stderr不会被缓冲。

There's also a related question

5

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

5

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

+3

这是不够的。你需要调用fflush(); – 2009-10-04 03:23:25

+1

除非它被重定向到一个文件,在这种情况下,它可能是更传统的缓冲而不是行缓冲。 – 2009-10-04 03:23:51

+0

好点,我认为线路缓冲没有很好的理由,谢谢。 – Falaina 2009-10-04 20:45:21

3

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

3

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

0

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

无论好坏,尽管如此,这并不是唯一的可能性。分段错误意味着操作系统检测到你做了错误的事情,通常写在分配的内存外面。至少在当前/之前检测到的情况下/在这种情况下,在这种情况下,在这种情况下,任何事情都可以改变程序在内部进行的足够程度的操作,以防止检测到问题。

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