为什么程序有时会“跳过”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
它是写的