为什么返回值为数值时,返回局部变量可以,而返回值为引用时,返回局部变量不可以?

返回的为数值时,那数值怎样返回,为什么不涉及地址?返回引用时,返回的是?... 返回的为数值时,那数值怎样返回,为什么不涉及地址?
返回引用时,返回的是?
展开
 我来答
ptfyb
2010-10-23 · TA获得超过384个赞
知道答主
回答量:223
采纳率:0%
帮助的人:124万
展开全部
这个问题其实是一个很好的问题,我可以从逆向工程的角度来给你解释一下,为了回答这个问题我专门去写了一个程序进行了测试。局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间。函数在返回参数的时候是这样的,先把要返回的数放在寄存器eax中,然后回到主函数中取出eax中的数值放在变量里,所以这样是不涉及函数中变量地址的。如果要返回引用,也就是变量地址,那么它会把这个变量的地址放在eax中,(注意这个地址是位于函数的栈空间里的,出了这个函数,这块内存就会被系统标记为可占用(就是其它程序可以占用)),回到主函数后系统会把这个地址赋值给主函数中的指针变量。此时主函数中的指针变量就指向了一个已经被标记为可占用的内存空间。如果你在不同的时刻输出这个指针所指地址的值会输出不同的结果。我的测试程序如下:
#include <stdio.h>

int * fun()
{
int p;
p = 100;
return &p;
}
int * fun2()
{
int p;
p = 200;
return &p;
}
void main()
{
int *p , *q;
p = fun();
printf("%d\n" , *p);
q = fun2();

printf("%d\n" , *p);
return;
}

这个程序和缓冲区溢出攻击原理有点相似,不明白给我留言
七凌雪
2010-10-23 · TA获得超过496个赞
知道答主
回答量:61
采纳率:0%
帮助的人:89.9万
展开全部
返回值是数值时,是将函数中的局部变量里存的值赋给另一个变量
例如a=fun(b,c);就是将fun函数里面的局部变量赋值给a,之后fun函数里的局部变量会释放,回收他们的内存空间,因此一旦出了fun函数,那么里面的局部变量就没有意义了。
而返回引用的时候,引用的变量的内存空间不会因为函数结束而被回收,因此出了fun函数后,引用的变量仍会保持最后一次被改动的值。
希望对你有所帮助。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式