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

时间:2011-09-05 11:37:05

标签: c segmentation-fault printf

我有以下代码:

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);
}

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

4 个答案:

答案 0 :(得分:10)

默认情况下,

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

只有stderr没有被缓冲... stdout被缓冲,因此在缓冲区已满,遇到换行符或者您具体的情况下,您不一定会看到输出冲洗流。

因此,如果您要打印调试消息,请使用stderr代替stdout