我搜索并找到了一个悬挂指针的程序,通过一些网站。我找到了一个在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;
}
答案 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写入一个文件然后每个你写的时间然后它将被写入文件中的新行,因为输入的效果是在键盘缓冲区中并且是不希望的。