如果关闭 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() 后所有内存都被释放,那么输出如何打印 [重复]的主要内容,如果未能解决你的问题,请参考以下文章