Согласно странице руководства fclose(3)
:Почему glclc fclose (NULL) вызывает ошибку сегментации вместо того, чтобы возвращать ошибку?
ВОЗВРАТ СТОИМОСТИ
После успешного завершения возвращается 0. В противном случае возвращается
EOF
, а глобальная переменнаяerrno
установлена для указания ошибки. В любом случае любой другой доступ к потоку приводит к неопределенным поведением.ОШИБКИ
EBADF
Файл дескриптора, лежащий в основеfp
не является действительным.
fclose()
функция также может дать сбой и установитьerrno
для любой из ошибок определены для подпрограммclose(2)
,write(2)
илиfflush(3)
.
Конечно fclose(NULL)
должны терпеть неудачу, но я ожидаю, что он вернуться с errno
обычно вместо смерти от ошибки сегментации непосредственно. Есть ли причина такого поведения?
Заранее благодарен.
ОБНОВЛЕНИЕ: Вставьте здесь свой код (особенно в strerror()
).
FILE *not_exist = NULL;
not_exist = fopen("nonexist", "r");
if(not_exist == NULL){
printError(errno);
}
if(fclose(not_exist) == EOF){
printError(errno);
}
Возможный дубликат [fclose(), вызывающий ошибку сегментации] (http://stackoverflow.com/questions/1443164/fclose-causing-segmentation-fault) –