未定义行为或已定义行为

Undefined behavior or defined behavior?

本文关键字:定义 未定义      更新时间:2023-10-16

我正在尝试这样做:

#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,"endn")!=0);
    free(s);
    return 0;
}

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

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

在这种情况下是一个未定义的行为吗?

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

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

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