我观察到有时候在C程序中,如果我们在分段错误之前的任何地方都有printf
代码,它就不会打印出来。为什么会这样?
答案 0 :(得分:20)
这是因为printf()
的输出被缓冲了。您可以在fflush(stdout);
之后立即添加printf
,然后打印。
你也可以这样做:
fprintf(stderr, "error string");
因为stderr
没有缓冲。
答案 1 :(得分:5)
如果在printf之后过早发生分段错误,并且没有刷新输出缓冲区,则不会看到printf的效果。
答案 2 :(得分:5)
大多数libc实现缓冲了printf输出。将换行符(\ n)附加到输出字符串以强制它刷新缓冲区内容通常就足够了。
答案 3 :(得分:3)
您可以在printf之后立即刷新输出缓冲区,以确保它在seg故障之前发生。例如。 fflush(stdout中)
答案 4 :(得分:3)
随机提示:如果您尝试调试分段错误,请务必尝试valgrind。它让它变得更容易!
答案 5 :(得分:0)
您已经获得了许多指出缓冲输出流的答案。
无论好坏,尽管如此,这是唯一的可能性。分段错误意味着操作系统检测到您做错了什么,通常写在外部分配的内存中。在这种情况下做差不多(更糟糕的是)做几乎任何事情可以改变程序在内部执行的操作,以防止检测到问题,至少在时间/情况下之前被发现了。
例如,段错误可能是通过写入未初始化的指针引起的 - 碰巧保持某个值(可能是一些小整数),因为您之前调用的函数将该值保留在正确的位置上当调用后一个函数并使用与指针相同的值时,它(合理地可靠地)包含操作系统检测为您不允许写入的位置的值。但是,调用printf可能意味着你在没有初始化的情况下在堆栈上留下一些完全不同的值。你还在写一些你不应该写的地方,但它现在可能在某个地方,操作系统不会知道你不应该写作。