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

ここでmyfunhel変数はどのように返されますか?戻る間、変数はどこに保持されますか?

4

2 に答える 2

3

コンパイラとターゲットの ABI に依存します。私が見たいくつか:

  • 複数のレジスタ: 小さな構造体は、一部の ABI の複数のレジスタで返すことができます

  • グローバル バッファ: バッファは、呼び出し元と呼び出し先の両方が知っている場所に割り当てることができます。

  • スタック上、呼び出し元のフレーム: 呼び出し元は、スタックに余分なスペースを割り当て、そのスペースのアドレスを隠し追加引数として関数に渡すことができます。

  • スタックでの引数の置き換え: 呼び出し先がスタックから引数をポップする ABI では、それらを戻り値に置き換えることができます。

于 2012-09-27T17:14:59.777 に答える
0

について話している場合、構造体へのポインターのみを返すことはできませんCstructviaにスペースを割り当てたと仮定すると、malloc返さcallocれるのはポインタです。最適化レベルに応じて、レジスタに返されるかスタックに返されるかを判断するのは困難です。

于 2012-09-27T08:18:55.980 に答える