1. ホーム
  2. c

[解決済み】C言語で関数から `struct` を返します。

2022-04-11 19:52:53

質問

今日、私は友人たちにC言語の使い方を教えていました。 struct s. そのうちの一人が struct へのポインターを返すことになる。 mallocstruct sの代わりに."。

C++をメインにやっている人間からすると、このようなものは返せないと思っていました。 struct を値で指定します。C++では operator = オブジェクトを値で返す関数を持つことは、非常に理にかなっています。しかし、C言語ではそのようなオプションがないため、私はコンパイラが実際に何をしているのかを考えるようになりました。次のようなことを考えてみよう。

struct MyObj{
    double x, y;
};

struct MyObj foo(){
    struct MyObj a;
    
    a.x = 10;
    a.y = 10;
    
    return a;
}        

int main () {

    struct MyObj a;
    
    a = foo();    // This DOES work
    struct b = a; // This does not work
      
    return 0;
}    

その理由は struct b = a; は動作しないはずです -- オーバーロードはできません。 operator = をデータ型として使用することができます。どうして a = foo(); はうまくコンパイルできるでしょうか?それは struct b = a; ? という問いかけが必要かもしれません。は一体何なのか? return ステートメントと連動して = のサインは?

どのように解決するのですか?

関数から構造体を返すことができます(あるいは = 演算子)は問題なく使用できます。 これは言語の中できちんと定義された部分なのです。 唯一の問題は struct b = a は、完全な型を提供しなかったことです。 struct MyObj b = a は正常に動作します。 構造体を渡すことができます。 から 構造体は、パラメータ渡し、戻り値、代入の点で、他の組み込み型と全く同じです。

構造体をパラメータとして渡す、関数から構造体を返す、代入文の中で構造体を使う、この3つを行う簡単なデモプログラムを紹介します。

#include <stdio.h>

struct a {
   int i;
};

struct a f(struct a x)
{
   struct a r = x;
   return r;
}

int main(void)
{
   struct a x = { 12 };
   struct a y = f(x);
   printf("%d\n", y.i);
   return 0;
}

次の例は、ほとんど同じですが、組み込みの int 型はデモのために使用します。 この2つのプログラムは、パラメータ渡しや代入などの値渡しに関して、同じ挙動をします。

#include <stdio.h>

int f(int x) 
{
  int r = x;
  return r;
}

int main(void)
{
  int x = 12;
  int y = f(x);
  printf("%d\n", y);
  return 0;
}