我特意在C11标准(ISO / IEC 9899:2011)或POSIX页面中寻找这个词。我检查了POSIX manual for fwrite,但它根本没有提到未定义的行为。但是,manual for fclose确实说
在调用fclose()之后,对流的任何使用都会导致未定义的行为。
但我仍然不知道NULL
流是否会导致UB。
答案 0 :(得分:2)
fread()
和fwrite()
都希望 stream 参数成为成功调用fopen()
,fdopen()
或{{返回的值1}}。由于这些函数在出错时返回NULL,因此 stream 参数不能为NULL。
由于手册页未说明当 stream 不是成功调用freopen()
等返回的值时会发生什么情况,这意味着手册页没有说明当发生时会发生什么 stream 不是成功调用fopen()
等返回的值,换句话说,行为未定义。
另见本委员会对“Why glibc's fclose(NULL) cause segmentation fault instead of returning error”问题的接受答案。