printf不出来,是怎么一回事

219 阅读2分钟

你是不是也遇到过这种情况,写好了这么一段简单的代码,信心满满地运行,但是出来的结果空空如也

int main(){
    printf("jason");
    ..............  
    while(1);
    return 0;
}

这么简单的代码,不能够是哪里错了吧。

v2-0abc2f0c9ebedf95368193759fb4b5d0_1440w.webp

但其实不然,上述的代码陷入了while(1)的死循环里面 这与C语言的底层运行逻辑有关,申请的内存要经过缓冲区才传送到操作系统,最后到达硬件后显示到屏幕上。(如下图所示)如果说printf是你想快递一件东西的指令,那么缓冲区就是各个小区的快递驿站,想要把这个快递寄出去的话就有以下几种解决办法

屏幕截图 2023-08-04 185021.png

1.取缔循环,简单粗暴-----解决掉死循环

这个while让快递一直停滞在了快递驿站,快递员本来一天的工作就是main里面这么多,结束工作能帮你把驿站里的快递送出去,但是这个main里面的while让快递小哥深陷漩涡,迟迟结束不了今天的工作,你就帮他解决这个死循环,他就能完美地结束这个main了

int main(){
    printf("jason");
    return 0;
}

2.给多点钱,提高优先级----“\n的妙用”

printf是以"行"来做缓冲区来刷新stdout的,如果遇到\n会强制立即刷新.否则刷新可能会延迟,快递小哥在看到\n后会立刻清理堆积的快递,不再纠结while,就算要纠结也是送出jason之后再纠结了。这个'\n'就相当于马上送出的快递费。

int main(){
    printf("jason\n");
     while(1);
    return 0;
}

3.自己动手,丰衣足食----“主动用fflush的函数即时发送”

这个函数fflush()的作用是用来刷新缓冲区,fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃; fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西强制打印到标准输出设备上。 fflush(stdout)在单进程程序中作用不大,但在多进程程序中很有用。程序的输出内容一般不会立即输出,而是在程序结束后再输出。fflush(stdout)会强制每次printf()都立即显示在标准输出设备上。

实在等不了了,一怒之下你暴走了,说“等你等到什么时候,磨磨唧唧的,我自己来得了。”于是你拿起快递,开车自己去送了......

int main(){
    printf("jason");
    fflush(stdout);
     while(1);
    return 0;
}

以上就是这个bug的解决方法,所以说,学好底层真的很重要。

v2-6ea7c6356b8f6fbf4c670d1991285da5_1440w.webp