以下程序中“fflush(stdin)”的确切含义是什么?

时间:2014-02-23 13:28:57

标签: c pointers

我搜索并找到了一个悬挂指针的程序,通过一些网站。我找到了一个在TC中完美执行的最佳程序。但由于我对fflush(stdin)的怀疑,我无法理解该程序的全部含义。所以请告诉以下程序的含义和其他程序:

    #include<stdio.h>
    int *call(void);
    int main(void) {
      int *ptr;
      ptr = call();
      fflush(stdin);
      printf("%d", *ptr);
      return 0;
    }
    int *call(void) {
      int x = 25;
      ++x;
      return &x;
    } 

3 个答案:

答案 0 :(得分:3)

fflush(stdin)一般没有意义,因为它是未定义的行为(有关为什么在答案中的换行符下面看this answer的原因的详细说明)。

fflush()刷新缓冲区,当它在这样的上下文中使用时,它通常用于尝试刷新输入缓冲区stdin。因此,没有任何“待定”缓冲区处于干净状态。

特别是在这个程序中根本没有任何意义。没有输入操作,因此它什么都不做 *

*当然“未定义的行为”意味着任何事情都可能发生,因此它可以某事,但是如果平台支持这个并且确实将缓冲区清除为预计,对代码没有明显影响。

答案 1 :(得分:2)

在此特定情况下,fflush(stdin)用于覆盖ptr的内容。任何函数都可能覆盖悬空堆栈指针。看起来fflush(stdin)是任意选择的。我得到了类似的结果:

#include<stdio.h>

int* call(void);
int* dummy(void);

int main(){
    int *ptr;
    ptr=call();
    printf("%d\n",*ptr);
    dummy();
    printf("%d\n",*ptr);
    return 0;
}

int* dummy(void) {
    int x=0;
    return &x;
}

int* call(void){
    int x=25;
    ++x;
    return &x;
}

答案 2 :(得分:0)

fflush的目的是清理或刷新由于其参数而生成的缓冲区。例如

char ch [10];
scanf("%s",ch); // here scanf finishes taking input after tou pressed enter and that enter may still remain in keyboardbuffer
fflush(stdin); //flushes that enter which is in keyboard buffer

现在假设如果我们使用FILE指针将ch写入文件,我们将在文件上有所需的输出。 如果你不使用

fflush(stdin);

并且想要将ch写入一个文件然后每个你写的时间然后它将被写入文件中的新行,因为输入的效果是在键盘缓冲区中并且是不希望的。