今天心血来潮,想弄清楚C语言的返回值为结构体,那它是怎么返回这些结构体的。
写了个简单的程序
#include <stdio.h>
struct abc
{
int a;
int b;
};
struct abc Ret()
{
struct abc temp;
temp.a = 1;
temp.b = 2;
return temp; //根据反汇编的结果,在这里已经把temp的内容复制到下面main里的temp1了
}
int main()
{
struct abc temp1;
temp1 = Ret(); //表面上应该在这里复制Ret函数里的值的,其实在上面的Ret函数还没有返回的时候这一个赋值已经做完了
printf("%d,%d\n", temp1.a, temp2.b);
}
temp1 = Ret(); 这一个语句里有一个玄机:
这个语句翻译成汇编之后和我们看到的C语言代码就不一样了,真实的情况是汇编之后这个语句被改变了,从反汇编之后的代码来看的话,这个语句变成了这样:
Ret(&temp1);
看见了吧,明明这个函数是没有参数的,结果temp1变量的地址作为参数传到了Ret函数里面去了。