c/c++语言开发共享如果调用fclose(0),这会关闭stdin吗?

如果调用fclose(0),这会关闭stdin吗?

我问这个的原因是由于某种原因,stdin在我的应用程序中被关闭,我无法找出原因。 我检查了fclose(stdin),这不在应用程序中,所以我想知道fclose(0)是否会导致未定义的行为,如关闭stdin?

如果没有,stdin可能被错误关闭的其他方式是什么?

    fclose的签名是这样的:

     int fclose ( FILE * stream ); 

    这意味着, fclose需要一个指向FILE对象的指针。 因此,如果传递0而不是指针,则0将被理解为NULL指针1 。 如果它的NULL指针,你怎么期望它关闭stdin ? 它不会关闭。 使用fclose(stdin) ,因为stdin本身是指向FILE对象的指针。

    我认为你将stdin与文件描述符混淆,文件描述符是整数类型,通常表示为fd 。 确实输入流的fd0 。 因此,如果您想使用fd (而不是FILE* ),那么您将使用 close

     #include  int close(int fildes); 

    也就是说, close(0)将关闭stdin。

    1:有趣的是,如果你已经将1传递给了fclose,意图关闭stdout ,你的代码甚至都不会编译,你会立即在编译时看到代码的问题。 现在的问题是,为什么不编译? 因为与0不同, 1不会隐式转换为指针类型。 编译器会生成类似"error: invalid conversion from 'int' to 'FILE*' 。请在ideone处查看错误和行号。

    我认为它将它作为fclose(NULL) ; 哪个应该是未定义的并且可能会崩溃。

    以下关闭stdin: close(0); fclose(stdin); close(STDIN_FILENO); daemon(0, 0);

    fclose(0)调用未定义的行为 ,所以是的,它可以做任何事情,包括关闭stdin 。 但是如果你的代码中出现fclose(0) ,你会遇到更大的问题。

    需要了解更多c/c++开发分享如果调用fclose(0),这会关闭stdin吗?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享如果调用fclose(0),这会关闭stdin吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979435.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐