(可追加分)被调用函数结束是内存释放?
比如一个程序:#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分。 展开
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分。 展开
3个回答
展开全部
这里涉及到堆和栈的问题,函数内部的局部变量,是被存储在栈内存里,是临时的;栈和堆的区别就是,栈内存不需要用户去申请和释放,而堆内存是需要用户自己申请,维护和释放的,例如,你用malloc函数申请了一块内存,你就必须使用free函数去释放掉它,不然,就会造成所谓的内存泄露,申请的内存就会一直不能再被使用,直到系统关机。
至于你说的为什么b的内存被释放了之后为什么还能被访问,是因为不管b的内存有没有被释放,b所在的内存地址的的确确是存在于系统中的,被释放了也还是存在的,只是这个函数执行完之后,它的内存里的内容可能会被改变。既然这个内存地址是存在的,那当然它里面也必然有值的,可以读。建议你用调试方法查看b的内存地址和内存里的内容。
至于你说的为什么b的内存被释放了之后为什么还能被访问,是因为不管b的内存有没有被释放,b所在的内存地址的的确确是存在于系统中的,被释放了也还是存在的,只是这个函数执行完之后,它的内存里的内容可能会被改变。既然这个内存地址是存在的,那当然它里面也必然有值的,可以读。建议你用调试方法查看b的内存地址和内存里的内容。
展开全部
b的内存在函数结束是被释放是指b的内存被释放了,那块内存可以另作他用了,而你返回的是地址,地址不会被改变,所以你可以通过地址继续访问,不过那块内存的值是不确定的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是内存释放,但是要知道其实内存释放,计算机也并不做什么,不会清零操作,这个单元内容并不改变(如果正好有其他程序使用这个单元,就会变)。子函数结束,b的作用域结束,在主程序中你就不能直接使用b,而你却是使用b单元的地址。比如 printf("%d", b); 这是非法的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询