为什么这个C程序没有打印任何东西?

Aas*_*aur -1 c linux stdout flush

我有以下代码:

int main()
{
   printf("hello world");
   while(1);
}
Run Code Online (Sandbox Code Playgroud)

打印你好世界吗?如果是,为什么?如果不是,为什么?我在linux机器上使用gcc来编译代码.

gsa*_*ras 6

我们无法分辨.

可以刷新标准输出缓冲区,但也可以不刷新.

换句话说,当printf("hello world");执行此操作时,"hello world"将存储在标准输出缓冲区中.

然后,因为while(1);,我们将进入无限循环.

此时,我们无法确定是否将刷新标准输出缓冲区.例如,在这种情况下Live demo,它不会发生,这是最可能发生的事情,但总的来说并不能保证.

通常我会添加换行符,以确保邮件被打印.阅读更多内容为什么printf在调用后不会刷新,除非换行符在格式字符串中?

另一种方法是这样的:

#include <stdio.h>
int main(){
  printf("hello world");
  fflush(stdout);
  while(1);
}
Run Code Online (Sandbox Code Playgroud)

会强制标准输出缓冲区自行清空并将存储在其中的内容导向标准输出(通常是屏幕).

正如@hyde所说,例如,你可以通过gdb为你冲洗缓冲区来激发原始代码的这种行为.阅读更多内容如何在不使用stdbuf和类似工具的情况下解除传统运行二进制文件的缓冲区.


这可能是一个假设的场景,但从中学到的一个教训是,在调试过程中,许多人使用printf()s,以便确定程序崩溃的位置.

不刷新输出缓冲区可能会导致错误的假设,因为程序员可能认为程序在此之前崩溃了printf("here");,但由于上面讨论的原因,可能不是这种情况.

换句话说,"here"可能不会在标准输出(例如屏幕)中打印,但这并不意味着我们程序的执行没有达到printf().