如题:
void main()
{
int fun();
printf("%d\n",fun());
}
int fun()
{
int a=15;
return a;
}
请问:fun()函数内定义的a,是不是在调用完就收回分配给a的存储空间呀!如果是那么这里返回给主函数的15又是储存在那里呢?
fun里的a存储在调用fun函数时开辟的栈空间里,这块栈只在调用fun时对fun可用,调用结束后返回的a,其实是暂存在寄存器里的(一般情况下是eax),而返回到main里时,main又会把返回的值拷贝到自己所有的栈空间里(在这里是以临时变量的形式)。所以不管是fun还是main,任何非static、register变量和常量的存储都是在函数的局部存储区里(也就是对当前调用函数可见的栈空间)。main也是一个函数。
1、调用完就收回;
2、不是,栈是一段公共内存,函数的代码也不是存在栈里的,只是从栈上给新调用的函数分配一段栈空间,用来保存这个函数执行期间用到的局部变量;
3、函数的返回是被保存在寄存器里的(这个返回指的是return,不包括通过参数返回或者全局变量),栈空间由程序自动维护,函数退出以后栈的内容其实不会更改,只是栈指针复位,所以函数内部的局部变量声明了如果不赋值,它的值就是随机的也就是这个道理。
确实收回了,出现这种情况是因为,内存虽然释放了,但是数据还是在内存的那块地址空间中没变的,所以这时你可以直接从这个地址中读出数据来,因为数据暂时没被破坏。如果这时你调用了一个别的函数再去读这块地址,你就会发现数据已经变了。
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息