• ベストアンサー

戻り値で構造体を返すことは可能でしょうか?

perlでは以下のように2つの戻り値が可能ですが、C言語では それができるのでしょうか? my (ret1, ret2) = test1(); よくやるのは、引数にポインタを渡して、内容を書き換える手を使っていますが、戻り値を複数返せたら、直感的にわかりやすいかなと思いまして・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.1

C言語から遠く離れた者ですが、 >>> よくやるのは、引数にポインタを渡して、内容を書き換える手を使っています これが常識でしょう。これが直感的に理解できるようにC言語を身に付ける必要があるのではないでしょうか。

その他の回答 (4)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

構造体を戻り値で返す方法でまったく問題ないのですがこの場合変数のコピーが行われます。 大きな構造体の場合はコピー処理の時間がもったいないので結局引数にポインタを渡す方法を使う事が多いですね。 #include <stdio.h> #include <string.h> typedef struct { int n; double d; char s[10]; } DATA; void func(DATA* d) { d->n = 123; d->d = -4.56e10; strcpy(d->s, "test"); } int main(void) { DATA data; func(&data); printf("%d %g %s\n", data.n, data.d, data.s); return 0; }

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.4

一つの関数で戻す値が二つある場合、その二つの戻り値には密接な関連があると考えられるので、 これを構造体として一つにまとめるのは十分妥当だと思われます。 その場合も構造体をコピーして戻すのではなく、あらかじめ確保した変数へのポインタを引き数で渡して、 その内容を書き換えるという手法が一般的だと思います。 そして戻り値はエラーコードを戻すために利用する。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

こんなサンプルで体感してみてください。 #include <stdio.h> #include <string.h> typedef struct { int n; double d; char s[10]; } DATA; DATA func(void) { DATA d; d.n = 123; d.d = -4.56e10; strcpy(d.s, "test"); return d; } int main(void) { DATA data; data = func(); printf("%d %g %s\n", data.n, data.d, data.s); return 0; }

noname#88356
noname#88356
回答No.2

戻り値を複数返すことは不可能ですが、 構造体でパックにして戻り値にすることは簡単です。 #include <stdio.h> typedef struct {   int a;   int b; } Test_t; // 戻り値が構造体な関数 Test_t GetTest( void ) {   Test_t Test = { 10, 20 };   return Test; } int main( void ) {   Test_t Test = GetTest();   printf("%d %d", Test.a, Test.b ); //構造体の中身を表示   return 0; }

関連するQ&A