2013-09-26 6 views
-3

Является stdin указателем, так как я видел его использование в fgets().Is stdin, 0, STDIN - это разные вещи

Я использовал '0', как мы используем для чтения или записи ошибочно для stdin и получил segfault во время fgets.

Является ли STDIN макросом и 0 одинаковыми.

Является stdin файловой указатель. Объясните, пожалуйста, об этом

+1

** man 3 stdin **: 'extern FILE * stdin;' –

+1

Вы также получили предупреждение компилятора, что вы полностью проигнорировали. Не делай этого. –

+0

Спасибо Тим. Пройдя через страницы руководства – Angus

ответ

1

stdin - это макрос, который расширяется до выражения типа FILE * (так, да, это указатель). Его значение не указано, но требуется указать конкретный объект, поэтому он определенно не является NULL.
0 - целочисленная константа, которая преобразуется в указатель NULL при использовании в контексте указателя. Из этого следует, что stdin != 0.
STDIN не определяется стандартной библиотекой C.

Вы, возможно, слышали о том, что на уровне ОС дескриптор файла, соответствующий stdin имеет значение 0, которое является истинным, но дескрипторы и FILE объекты не то же самое, и они не могут быть использованы как взаимозаменяемые. (Если вы находитесь в системе Unixy, прочитайте /usr/include/stdio.h где-то. Это «просто» больше C. Обычно существует конкретное определение объекта FILE, как довольно сложного struct, хотя это стандарт не требуется.)

+0

Это было хорошее объяснение Зак. Спасибо, что помогли мне понять разницу. – Angus

3

стандартного ввода является FILE * от stdio.h

STDIN_FILENO == fileno(stdin) 

STDIN_FILENO в unistd.h и используется для функций, таких как write, в то время как стандартный ввод в виде файла * используется для STDIO функций, таких как printf

+0

Спасибо Макс за помощь в понимании. – Angus

Смежные вопросы