1

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

这是我的示例程序

#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);
}

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

4

2 回答 2

3

这取决于编译器和目标的 ABI。我见过的一些:

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

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

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

  • 在堆栈上替换 args:在被调用者从堆栈中弹出 args 的 ABI 中,它可以用返回值替换它们。

于 2012-09-27T17:14:59.777 回答
0

你不能只返回一个指向它的指针,只要我们在谈论C. 假设您为您的structvia malloc/分配了空间,calloc它将是返回的指针。很难判断它是在寄存器中返回还是在堆栈中返回,这取决于优化级别。

于 2012-09-27T08:18:55.980 回答