return返回机制

问题引入:为什么return函数里面的定义值可以,但是return函数里面的定义地址就有问题?

原因分析:原文见  https://zhidao.baidu.com/question/192660719.html

这个问题其实是一个很好的问题,我可以从逆向工程的角度来给你解释一下,为了回答这个问题我专门去写了一个程序进行了测试。

为什么局部变量可以返回?

局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间函数在返回参数的时候是这样的,先把要返回的数放在寄存器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:

void get_memory(char *p)
{
    p = (char*)malloc(100);
}
void Test(void)
{
    char * str;
    get_memory(str);
    strcpy(str,"PSST");
    printf("str:%s\n",str);
}

示例代码2:

char* get_memory(void)
{
    char p[] = "PSST";
    return p;
}
void Test(void)
{
    char * str = NULL;    
    str = get_memory();
    printf("str:%s\n",str);
}

 

posted @ 2020-10-22 15:28  Anita光子  阅读(225)  评论(0编辑  收藏  举报