函数使用结构体、结构体指针作为返回值分析

[复制链接]
582|2
手机看帖
扫描二维码
随时随地手机跟帖
kaizi99998|  楼主 | 2019-9-2 10:10 | 显示全部楼层 |阅读模式
在编程中遇到的问题,并在网上搜索到的技术贴,觉得很好,保存到字节的帖子来!感谢网络上的技术大牛!!!
**出处:https://blog.csdn.net/dfq12345/article/details/73924580
------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下为复制被人的帖子:

32位机,gcc编译器
使用结构体作为返回值

分析反汇编代码可知,当被调用的子函数返回值为结构体的时候,调用函数将分配一段空间用于存放返回的结构体(使用一个结构体变量接受返回值),并将这段空间的地址作为调用时的参数压栈。子程序不负责对要返回的结构体分配空间。最后返回eax中存放的是结构体空间(栈中)的地址。在子程序退出的时候,调用函数可以在自己的栈帧中访问到返回的值。

#include <stdio.h>
typedef struct {
        int a;
        int b;
}Stu;

Stu getStu(int x, int y)
{
        Stu result;
        result.a = x;
        result.b = y;
        return result;
}

int main()
{
        int a = 2, b = 3;
        Stu test = getStu(a, b);
        printf("%d %d\n", test.a, test.b);
        return 0;
}


使用结构体指针作为返回值

在反汇编代码中可以看到,子程序填充malloc在堆中生成的结构体空间,并将其地址存放在eax中返回。但是这种使用方式存在的很大问题是在子程序中使用到了malloc但是没有与之对应的free,如果在调用函数中忽视释放操作的话将会导致堆内存的泄露。当然在C++中可以使用构造函数和析构函数处理这些细节。

测试使用的C程序:


#include <stdio.h>
#include <stdlib.h>

typedef struct {
        int a;
        int b;
}Stu;

Stu * getStu(int x, int y)
{
        Stu *pStu = malloc(sizeof(Stu));
        pStu->a = x;
        pStu->b = y;
        return pStu;
}

int main()
{
        int x = 2, y = 3;
        Stu *pStu = getStu(x, y);
        printf("%d %d\n", pStu->a, pStu->b);
        free(pStu);
        return 0;
}


文中说的很详细,就不在增加说明了。原文中有对应的反汇编代码,有兴趣可以看下。



使用特权

评论回复

相关帖子

airwill| | 2020-4-25 11:14 | 显示全部楼层
从头至尾 没有看到汇编代码呀

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

52

帖子

0

粉丝