如果关闭 fun() 后所有内存都被释放,那么输出如何打印 [重复]

Posted

技术标签:

【中文标题】如果关闭 fun() 后所有内存都被释放,那么输出如何打印 [重复]【英文标题】:If after closing fun() all the memory gets deallocated then how is the output printed [duplicate] 【发布时间】:2019-06-25 12:55:31 【问题描述】:

下面的C程序的输出是什么?关闭后fun()的所有变量都被释放内存时,输出是如何打印的。

#include<stdio.h>
int * fun()

    int q = 10;
    int *p;
    p = &q;
    return p;
    
int main()

    int *res;
    res= fun();
    printf("%d", *res);
    return 0;


我希望指针 res 指向 null

【问题讨论】:

这是未定义的行为。 当您执行printf("%d", *res); 时,您要打印的int 在哪里?它是在哪条线上制作的? 被释放的内存与将指向它的指针设置为null不同。 内存分配/释放有几种不同的机制。此外,即使内存被释放(也就是说,当您在使用malloc 动态分配的内存上调用free 时,或者当您从函数返回以释放其本地内存或“堆栈帧”时) ,关键是释放的内存通常不会立即销毁甚至不可用。它仍然在那里,在同一个地址,所以如果你有一个指向它的指针,你仍然可以看到它——但是如果你的代码的其他部分分配并开始使用它,它可能随时改变.. 【参考方案1】:

您正在返回一个指向堆栈上地址的指针。一个合理的编译器会给你这样的警告:

“警告C4172:返回局部变量或临时地址:q”

但基本上行为是未定义的,还取决于您的优化水平。

【讨论】:

以上是关于如果关闭 fun() 后所有内存都被释放,那么输出如何打印 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

idea报错springcontextrelease

释放内存

js中的垃圾回收机制

JavaScript基础知识六(内存释放作用域销毁)

C++的内存分配问题

java中Static的作用