在C中,从函数返回结构的机制是什么

在C中,从函数返回结构的机制是什么,c,structure,C,Structure,请解释一下,函数返回的结构变量是如何实现的。基本上,当从函数返回单个变量时,该值将被放入寄存器并返回。但在结构返回的情况下,这将如何工作。我假设结构将被复制到某个全局位置并返回指针。这将由编译器管理。我的理解正确吗 这就是我的示例程序 #include <stdio.h> #include <stdlib.h> typedef struct ss { char name[10]; int val; } HELLO; HELLO *ptr=NULL; HEL

请解释一下,函数返回的结构变量是如何实现的。基本上,当从函数返回单个变量时,该值将被放入寄存器并返回。但在结构返回的情况下,这将如何工作。我假设结构将被复制到某个全局位置并返回指针。这将由编译器管理。我的理解正确吗

这就是我的示例程序

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

typedef struct ss
{
  char name[10];
  int val;
} HELLO;


HELLO *ptr=NULL;

HELLO myfun()
{
   HELLO hel = {"Salil", 20};
   ptr = &hel;
   return hel;
}
main()
{

  HELLO hel1;
  hel1 = myfun();
  if ( ptr ) printf("The val = %s \n", ptr->name);
}
#包括
#包括
类型定义结构ss
{
字符名[10];
int-val;
}你好,;
HELLO*ptr=NULL;
你好,我的朋友
{
你好,Hell={“Salil”,20};
ptr=&hel;
返回hel;
}
main()
{
你好,hel1;
hel1=myfun();
if(ptr)printf(“val=%s\n”,ptr->name);
}

myfun
中,如何返回
hel
变量?返回时变量将保存在哪里?

如果我们讨论的是
C
,则不能仅返回指向它的指针。假设您通过
malloc
/
calloc
struct
分配了空间,那么将返回指针。很难判断它是在寄存器中返回还是在堆栈中返回,这取决于优化级别。

它取决于编译器和目标的ABI。我看到的一些:

  • 多寄存器:在某些ABI中,可以在多个寄存器中返回小结构

  • 全局缓冲区:可以在调用者和被调用者都知道的地方分配缓冲区

  • 在堆栈上,调用方的帧:调用方可以在堆栈上分配额外的空间,并将该空间的地址作为隐藏的额外参数传递给函数

  • 堆栈上替换参数:在被调用方从堆栈中弹出参数的ABI中,它可以用返回值替换这些参数


Orr只是设置为堆栈上的一个变量。这个问题取决于您使用的调用约定。永远不要在堆栈上创建指向变量的指针并让调用者使用它。它将失败并且很难发现原因-1:不正确,至少从最初的C89 ANSI标准开始,C就允许返回结构,在此之前有很多实现。谢谢你的回答。我们有没有办法通过objdump或其他什么东西来了解这个机制是如何工作的。如果你反汇编这个函数,或者只是用-S编译,那么你就可以阅读程序集,看看编译器在做什么。