首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fflush()在悬空指针方面做什么?

fflush()在悬空指针方面做什么?
EN

Stack Overflow用户
提问于 2017-04-23 02:15:00
回答 2查看 146关注 0票数 3

我遇到了此页,它演示了创建悬空点的常见方式。

下面的代码用于通过返回局部变量的地址来说明悬挂指针:

代码语言:javascript
复制
// The pointer pointing to local variable becomes  
// dangling when local variable is static.
#include<stdio.h>

int *fun()
{
    // x is local variable and goes out of scope 
    // after an execution of fun() is over.
    int x = 5;

    return &x;
}

// Driver Code
int main()
{
    int *p = fun();
    fflush(stdout);

    // p points to something which is not valid anymore
    printf("%d", *p);
    return 0;
}

在运行它时,这是我得到的编译器警告(如预期的那样):

代码语言:javascript
复制
 In function 'fun':
12:2: warning: function returns address of local variable [-Wreturn-local-addr]
  return &x;
  ^

这就是我得到的输出(到目前为止还不错):

代码语言:javascript
复制
32743

但是,当我注释掉fflush(stdout)行时,这是我得到的输出(带有相同的编译器警告):

代码语言:javascript
复制
5

这种行为的原因是什么?fflush命令的存在/缺失究竟是如何导致这种行为改变的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-23 02:18:09

如前所述,将指针返回到堆栈上的对象是错误的。您只看到fflush()调用存在问题的原因是,如果堆栈不存在,则不会对其进行修改。也就是说,5还在,所以指针取消引用仍然会将5提供给您。如果在funprintf之间调用一个函数(几乎任何函数,可能是任何函数),它几乎肯定会覆盖堆栈位置,使得后面的取消引用返回该函数碰巧离开的任何垃圾。

票数 3
EN

Stack Overflow用户

发布于 2017-04-23 02:38:25

这是因为调用fflush(stdout)会写入x所在的堆栈。

让我解释一下。汇编语言中的堆栈(所有编程语言最终都以某种方式运行)通常用于存储局部变量、返回地址和函数参数。当一个函数被调用时,它将这些东西推到堆栈上:

  • 函数完成后继续执行代码的地址。
  • 函数的参数,按所使用的调用约定确定的顺序。
  • 函数使用的局部变量。

然后,这些东西一个接一个地从堆栈中弹出,只需改变CPU认为堆栈顶部的位置即可。这意味着数据仍然存在,但它不能保证继续存在。

fun()覆盖堆栈顶部上方的前一个值之后调用另一个函数,在本例中使用stdout值,因此指针的引用值发生变化。

如果不调用另一个函数,数据就会停留在那里,并且在指针被取消引用时仍然有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43566705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档