gpt4 book ai didi

c - fflush() 在悬挂指针方面做了什么?

转载 作者:行者123 更新时间:2023-12-03 22:19:57 25 4
gpt4 key购买 nike

我遇到了 this page这说明了创建悬挂点的常见方式。

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

// 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;
}

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

 In function 'fun':
12:2: warning: function returns address of local variable [-Wreturn-local-addr]
return &x;
^

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

32743

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

5

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

最佳答案

正如您所提到的,返回指向堆栈上对象的指针是不好的。您只看到 fflush() 调用存在问题的原因是,如果堆栈不存在,则堆栈未被修改。也就是说,5 仍然存在,因此指针取消引用仍将 5 提供给您。如果您在 funprintf 之间调用一个函数(几乎任何函数,可能),它几乎肯定会覆盖该堆栈位置,从而使以后的取消引用返回该函数的任何垃圾碰巧离开那里。

关于c - fflush() 在悬挂指针方面做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43566705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com