为什么程序有时会“跳过”printfs?

我有以下代码:

if (!strcmp(ent_child->d_name, "eeprom")){ printf("\tread_from_driver: found a match! ");//DEBUG get_child_path(child_path, child_path, "eeprom"); printf("The path is: %s\n", child_path);//DEBUG read_eeprom(child_path); } 

这会在某些时候导致段错误(可能是get_child_path),但是第一个printf永远不会发生,即使我将代码修改为:

 if (!strcmp(ent_child->d_name, "eeprom")){ while(1) printf("\tread_from_driver: found a match! ");//DEBUG get_child_path(child_path, child_path, "eeprom"); printf("The path is: %s\n", child_path);//DEBUG read_eeprom(child_path); } 

它确实发生了。 这是怎么回事? 这绝对不是我第一次观察到这种行为。

默认情况下, stdout行缓冲的,这意味着只有在发送换行符或显式调用fflush(stdout)时才会获得更新的输出。

在每个printf的末尾使用\n以确保刷新输出。 否则它被缓冲而不是立即写入。

只有stderr没有被缓冲… stdout被缓冲,因此在缓冲区已满,遇到换行符或者您专门刷新流之前,您不一定会看到输出。

因此,如果您要打印调试消息,请使用stderr而不是stdout

\n放在第一个printf的末尾,分段错误警告消除了最后一个输出行。 我真的无法解释它,我只知道如果你把它写成\n它是写的