今天心血来潮,想弄清楚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函数里面去了。
本文通过一个C语言示例程序,详细解析了结构体作为函数返回值时的实际传递过程。通过对比C语言源代码与对应的汇编代码,揭示了看似简单的赋值操作背后隐藏的复杂机制。
15万+

被折叠的 条评论
为什么被折叠?



