为什么返回值为数值时,返回局部变量可以,而返回值为引用时,返回局部变量不可以?
2个回答
展开全部
这个问题其实是一个很好的问题,我可以从逆向工程的角度来给你解释一下,为了回答这个问题我专门去写了一个程序进行了测试。局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间。函数在返回参数的时候是这样的,先把要返回的数放在寄存器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;
}
这个程序和缓冲区溢出攻击原理有点相似,不明白给我留言
#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;
}
这个程序和缓冲区溢出攻击原理有点相似,不明白给我留言
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询