C 是stdin,0,stdin是不同的东西

C 是stdin,0,stdin是不同的东西,c,unix,C,Unix,Is stdin是一个指针,正如我在fgets()中看到的那样 我使用了“0”,因为我们错误地将其用于stdin的读取或写入,并且在fgets期间出现了segfault Is STDIN宏和0是相同的 Is stdin是一个文件指针。请对此进行解释stdin是stdio.h STDIN_FILENO == fileno(stdin) STDIN\u FILENO位于unistd.h中,用于write等函数,而STDIN作为文件*用于printf等stdio函数。STDIN是一个宏,可扩展为Fi

Is stdin是一个指针,正如我在fgets()中看到的那样

我使用了“0”,因为我们错误地将其用于stdin的读取或写入,并且在fgets期间出现了segfault

Is STDIN宏和0是相同的


Is stdin是一个文件指针。请对此进行解释

stdin是
stdio.h

STDIN_FILENO == fileno(stdin)

STDIN\u FILENO
位于
unistd.h
中,用于
write
等函数,而STDIN作为文件*用于
printf
等stdio函数。STDIN
是一个宏,可扩展为
File*
类型的表达式(因此,是的,它是一个指针)。它的值未指定,但需要指向具体对象,因此它肯定是非空的。
0
是一个整数常量,在指针上下文中使用时会转换为空指针。因此,
stdin!=0

STDIN
不是由标准C库定义的


您可能听说过与
stdin
对应的操作系统级文件描述符的值为0,这是真的,但是文件描述符和
file
对象不是一回事,它们不能互换使用。(如果您使用的是Unixy系统,请在某个时候阅读
/usr/include/stdio.h
。它“只是”更多的C。通常那里有一个
文件
对象的具体定义,作为一个相当复杂的
结构
,即使标准不要求这样做。)

man 3 stdin:
外部文件*stdin您还收到一个编译器警告,您完全忽略了它。别那么做,谢谢你,蒂姆。我会翻阅手册,这是一个很好的解释,扎克。谢谢你帮助我理解差异。谢谢Max帮助我理解。