【问题标题】:Undefined behavior or defined behavior? [duplicate]未定义的行为或已定义的行为? [复制]
【发布时间】:2015-09-10 09:54:44
【问题描述】:

我正在尝试这样做:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAX_SIZE 50
int main()
{
    char *s = malloc(sizeof(char)*MAX_SIZE);
    do{
      int r = read(STDIN_FILENO, s, MAX_SIZE);
      if(r==-1) printf("error ");

      else{
        write(STDERR_FILENO, s, MAX_SIZE);
      }

      while(getchar()!='\n');
    } while(strcmp(s,"end\n")!=0);

    free(s);
    return 0;
}

我的问题是:在这种情况下 fflush(stdin) 是未定义的行为吗? 当我在互联网上搜索时,我读到 fflush(stdin) 是一种已定义的行为: 通过标准 C 将输入流传递给 fflush 是一种未定义的行为...... STDIN 是输入流(缓冲) 我认为未定义的行为是标准 C 未指定在特定情况下必须具有特定功能的行为。

所以遵循标准 C 是一种未定义的行为,对吗?

那么在这种情况下是未定义的行为吗?

【问题讨论】:

  • 混合 stdio 库和使用原始文件描述符不是一个好主意。
  • 这个问题很不清楚。您已经展示了一些不使用fflush 并且充满了不相关的干扰的代码,mallocfree 没用(只需使用char s[50]),MAX_SIZE 没用,sizeof(char) 没用等等。此外,“问题”是同一件事重复 3 或 4 次,措辞略有不同,标点符号差,然后你再问同样的问题两次。难道整个事情就不能简单地称为“fflush(stdin) 未定义的行为吗?”并摆脱所有其余的?!
  • 为什么是个坏主意? @Ed 治愈
  • 因为 stdio 使用缓冲区,原始指针不使用。事情变得混乱。
  • 因为sizeof(char) 在所有系统上始终为 1,所以您只需写 1。这样更简单。您的示例可能只使用了 char s[MAX_SIZE]; 而根本不需要 malloc、free 或 sizeof(char)。

标签: c++ undefined-behavior


【解决方案1】:

C 标准中fflush 的描述似乎很清楚:

如果流指向一个输出流或更新流,其中最近的操作没有被输入,[...];否则,行为是 未定义

将输入流传递给fflush 是未定义的行为。

【讨论】:

  • SingleUnix 为可搜索的输入流添加了行为。不过,我不确定这是否真的有用并在任何地方实施。
  • 非常感谢!现在我明白了。谢谢。
  • @dhke,这是一个很好的观点,POSIX(实现非常广泛!)将其定义为基本 C 标准的扩展。但它只对能够搜索的流产生影响,而标准输入通常不会。
  • 那个在任何地方实现是为了专门指这个特定的功能。因为例如在 Linux 和 FreeBSD fflush() 上,手册页记录了简单地向输入流发送信号 EBADF 的行为。不过,Solaris 记录了 POSIX 行为。
猜你喜欢
  • 1970-01-01
  • 2017-12-27
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多