调用fclose函数导致提示语句无法执行的原因分析
fclose函数导致提示语句无法执行的原因分析
问题场景
测试fclose函数时发现:当保留fclose(p_file2)代码行时,printf("File \"file2.bin\" inexistent!");语句无法被执行;移除该行后,该提示信息可正常显示。相关C语言代码如下:
#include <stdio.h> int main() { printf("Hello files"); FILE *p_file1, *p_file2; p_file1 = fopen("file1.bin", "w+b"); p_file2 = fopen("file2.bin", "r+b"); if (p_file2 == NULL) printf("File \"file2.bin\" inexistent!"); fclose(p_file1); fclose(p_file2); return 0; }
原因解析
- 空指针调用fclose触发未定义行为:当
file2.bin不存在时,fopen打开失败,返回NULL给p_file2。此时调用fclose(NULL)属于C标准定义的未定义行为——程序可能直接崩溃、提前终止,或者出现其他不可预料的结果。 - 输出缓冲区未刷新:标准输出默认是行缓冲模式,
printf的内容没有换行符\n,会暂时留在输出缓冲区里。如果程序因为fclose(NULL)崩溃终止,操作系统不会自动刷新缓冲区,导致终端看不到提示信息;移除fclose(p_file2)后,程序正常执行到结束,会自动刷新缓冲区,所以提示内容能显示出来。
内容的提问来源于stack exchange,提问作者Dalton Cézane
相关产品推荐
相关产品推荐

