在编程中遇到的问题,并在网上搜索到的技术贴,觉得很好,保存到字节的帖子来!感谢网络上的技术大牛!!!
**出处: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;
}
文中说的很详细,就不在增加说明了。原文中有对应的反汇编代码,有兴趣可以看下。
|