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

返回的为数值时,那数值怎样返回,为什么不涉及地址?
返回引用时,返回的是?

这个问题其实是一个很好的问题,我可以从逆向工程的角度来给你解释一下,为了回答这个问题我专门去写了一个程序进行了测试。局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间。函数在返回参数的时候是这样的,先把要返回的数放在寄存器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;
}

这个程序和缓冲区溢出攻击原理有点相似,不明白给我留言
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-23
返回值是数值时,是将函数中的局部变量里存的值赋给另一个变量
例如a=fun(b,c);就是将fun函数里面的局部变量赋值给a,之后fun函数里的局部变量会释放,回收他们的内存空间,因此一旦出了fun函数,那么里面的局部变量就没有意义了。
而返回引用的时候,引用的变量的内存空间不会因为函数结束而被回收,因此出了fun函数后,引用的变量仍会保持最后一次被改动的值。
希望对你有所帮助。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网