关于函数返回值的存储问题?
如题:voidmain(){intfun();printf("%d\n",fun());}intfun(){inta=15;returna;}请问:fun()函数内定义的...
如题:void main(){ int fun(); printf("%d\n",fun()); } int fun(){ int a=15; return a;} 请问:fun()函数内定义的a,是不是在调用完就收回分配给a的存储空间呀!如果是那么这里返回给主函数的15又是储存在那里呢?
展开
2个回答
2014-01-16
展开全部
fun里的a存储在调用fun函数时开辟的栈空间里,这块栈只在调用fun时对fun可用,调用结束后返回的a,其实是暂存在寄存器里的(一般情况下是eax),而返回到main里时,main又会把返回的值拷贝到自己所有的栈空间里(在这里是以临时变量的形式)。所以不管是fun还是main,任何非static、register变量和常量的存储都是在函数的局部存储区里(也就是对当前调用函数可见的栈空间)。main也是一个函数。
1、调用完就收回;
2、不是,栈是一段公共内存,函数的代码也不是存在栈里的,只是从栈上给新调用的函数分配一段栈空间,用来保存这个函数执行期间用到的局部变量;
3、函数的返回是被保存在寄存器里的(这个返回指的是return,不包括通过参数返回或者全局变量),栈空间由程序自动维护,函数退出以后栈的内容其实不会更改,只是栈指针复位,所以函数内部的局部变量声明了如果不赋值,它的值就是随机的也就是这个道理。
1、调用完就收回;
2、不是,栈是一段公共内存,函数的代码也不是存在栈里的,只是从栈上给新调用的函数分配一段栈空间,用来保存这个函数执行期间用到的局部变量;
3、函数的返回是被保存在寄存器里的(这个返回指的是return,不包括通过参数返回或者全局变量),栈空间由程序自动维护,函数退出以后栈的内容其实不会更改,只是栈指针复位,所以函数内部的局部变量声明了如果不赋值,它的值就是随机的也就是这个道理。
2014-01-16
展开全部
确实收回了,出现这种情况是因为,内存虽然释放了,但是数据还是在内存的那块地址空间中没变的,所以这时你可以直接从这个地址中读出数据来,因为数据暂时没被破坏。如果这时你调用了一个别的函数再去读这块地址,你就会发现数据已经变了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询