Ответ 1
Подпись fclose
такова:
int fclose ( FILE * stream );
Это означает, что fclose
ожидает указатель на объект FILE
. Поэтому, если вы передадите 0
, вместо указателя 0
будет пониматься как NULL
указатель 1. Если его указатель NULL, как вы ожидаете, его закрыть stdin
? Он не будет закрыт. Используйте fclose(stdin)
, поскольку stdin
сам является указателем на объект FILE
.
Я думаю, вы путаете stdin
с файловым дескриптором, который имеет целочисленный тип и обычно обозначается как fd
. Его правда, что входной поток fd
равен 0
. Поэтому, если вы хотите использовать fd
(вместо FILE*
), вы должны использовать close
из <unistd.h>
.
#include <unistd.h>
int close(int fildes);
То есть, close(0)
закрывает stdin.
<суб > 1: Кажется интересным, что если вы отправили 1
, чтобы закрыть закрытие stdout
, ваш код даже не будет компилироваться, и вы сразу увидите проблему с вашим кодом во время компиляции. Теперь вопрос в том, почему он не компилируется? Поскольку в отличие от 0
, 1
неявно преобразован в тип указателя. Компилятор будет генерировать сообщение типа "error: invalid conversion from ‘int’ to ‘FILE*’
. См. Номер ошибки и номер строки здесь на ideone.