zoukankan      html  css  js  c++  java
  • 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
    " , *p);
    q = fun2();
    printf("%d
    " , *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
    ",str);
    }

    示例代码2:

    char* get_memory(void)
    {
        char p[] = "PSST";
        return p;
    }
    void Test(void)
    {
        char * str = NULL;    
        str = get_memory();
        printf("str:%s
    ",str);
    }
  • 相关阅读:
    383. Ransom Note
    598. Range Addition II
    453. Minimum Moves to Equal Array Elements
    492. Construct the Rectangle
    171. Excel Sheet Column Number
    697. Degree of an Array
    665. Nondecreasing Array
    视频网站使用H265编码能提高视频清晰度吗?
    现阶段的语音视频通话SDK需要解决哪些问题?
    企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  • 原文地址:https://www.cnblogs.com/anitaguangzi/p/13858547.html
Copyright © 2011-2022 走看看