(可追加分)被调用函数结束是内存释放?

比如一个程序:#include<stdio.h>int*fun(inta);voidmain(){inta=9;printf("%d",*fun(a));}int*fun... 比如一个程序:#include <stdio.h>
int *fun(int a);
void main()
{
int a=9;
printf("%d",*fun(a));

}
int *fun(int a)
{
int b;
b=a+2376;
return (&b);
}fun函数结束时b的内存被释放,返回b的地址,为什么还能在访问呢?printf("%d",*fun(a));释放内存又是怎么释放吗?(从计算机内部来看)。谢谢大家了!
被采纳的答案追加15分。
展开
 我来答
cwc_2009
2011-04-30 · TA获得超过304个赞
知道小有建树答主
回答量:173
采纳率:100%
帮助的人:172万
展开全部
这里涉及到堆和栈的问题,函数内部的局部变量,是被存储在栈内存里,是临时的;栈和堆的区别就是,栈内存不需要用户去申请和释放,而堆内存是需要用户自己申请,维护和释放的,例如,你用malloc函数申请了一块内存,你就必须使用free函数去释放掉它,不然,就会造成所谓的内存泄露,申请的内存就会一直不能再被使用,直到系统关机。

至于你说的为什么b的内存被释放了之后为什么还能被访问,是因为不管b的内存有没有被释放,b所在的内存地址的的确确是存在于系统中的,被释放了也还是存在的,只是这个函数执行完之后,它的内存里的内容可能会被改变。既然这个内存地址是存在的,那当然它里面也必然有值的,可以读。建议你用调试方法查看b的内存地址和内存里的内容。
wei398262294
2011-04-30 · TA获得超过106个赞
知道答主
回答量:83
采纳率:0%
帮助的人:74.6万
展开全部
b的内存在函数结束是被释放是指b的内存被释放了,那块内存可以另作他用了,而你返回的是地址,地址不会被改变,所以你可以通过地址继续访问,不过那块内存的值是不确定的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
breakaleg2011
2011-05-01
知道答主
回答量:21
采纳率:0%
帮助的人:6.1万
展开全部
是内存释放,但是要知道其实内存释放,计算机也并不做什么,不会清零操作,这个单元内容并不改变(如果正好有其他程序使用这个单元,就会变)。子函数结束,b的作用域结束,在主程序中你就不能直接使用b,而你却是使用b单元的地址。比如 printf("%d", b); 这是非法的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式