- 締切済み
関数の戻り値が複数ある場合
C言語初心者です。 関数の戻り値を返す場合、return 変数名;と記述しますよね。 配列を返す場合、ポインタを使用しないで返すにはどうしたらいいですか? 例えば合計と平均を計算する関数があり その結果を配列に入れてmainに返すなど。 以前他の方の質問のコメントに 配列の要素が固定であれば、構造体にして返す方法もあります。 struct array { int x[10]; }; struct array func() { struct array a; ... return a; } -- とあったのですが、構造体の要素が全てint型ならば 配列ではダメなのですか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- ukeyama
- ベストアンサー率14% (1/7)
これは根本的な「考え方」の話になりますが、 仮に配列を返すことができたとしても、あまりそういうやり方は避けるべきと思います。 理由を簡単に言うと、スタックに積みすぎてしまうからです。 質問者さんが挙げたような方法を例にとると、まだ配列要素が10個で各要素がintですから、40バイトですみますが、もしもっと大きな配列(Kバイト単位)の配列を扱おうとしたら、ひどくスタックを消費しますし、また、その関数が頻繁に使われるものだとすると、スタックへのpushとpopの時間もバカにならなくなってくるからです。 もし組み込みの世界でしたら、禁忌のレベルではないかと推測します。
- jacta
- ベストアンサー率26% (845/3158)
配列を返すとすれば、 int func(void)[10] { ... } のようになるかと思います。 しかし、return文が式を伴う場合、返却型のオブジェクトに式の評価結果を 代入するかのように振舞わなければなりません。しかし、配列は代入することができません。 もし、 int (*func(void))[10] { static int result[10]; ... return &result; } としてもよいのであれば、配列そのものではありませんが、配列へのポインタを返すことができます。 int *func(void) { static int result[10]; ... return result; } このようにしてしまうと、配列のサイズ情報が落ちてしまいますので、やはり先ほどの方式がお勧めです。 ただし、マルチスレッド環境の場合は要注意です。
- titokani
- ベストアンサー率19% (341/1726)
>とあったのですが、構造体の要素が全てint型ならば >配列ではダメなのですか? int[10] func() { int a[10]; ... return a; } という感じでしょうか。 構造体が返せるなら、できてもよさそうなものですが、できません。 もともと、Cでは配列も構造体を返すこともできなかったのです。 それが、いつのころからか構造体は返せるようになりました。 このとき、配列を返せるようになってもよかったのでしょうが、文法が複雑になるからなのか、配列はいまだに返せないままです。 まあ、そういう仕様なので、あきらめましょう。
- redfox63
- ベストアンサー率71% (1325/1856)
> 構造体の要素が全てint型ならば配列ではダメなのですか? は int* func() { int aa[10]; // 何かの処理 aa[0] = 100; return aa; } といった事を考えておられるのなら無理です 関数funcを呼び出した直後であれば 返されたポインタからデータを参照できるかのように思えますが、これはあくまでスタック上に残っているゴミであって 信頼できるデータではありません なぜなら ローカルの自動変数はその関数終了と同時にCの管理からはずされてしまうからです void foo() { int *p1 = func(); bar(); printf( "%d\n",*p ); } とした場合 int *p1 = func(); で関数fooに戻ってきた直後は *pは100になっている可能性はあります しかし、barを呼び出して戻ってきた後まで *pが100である保障はありません … barによりスタックの内容が変更されるため したがって printf( "%d\n",*p ); は何を出力するかわからないことになります これに対して 構造体を返す関数は 構造体の中身をスタックに積んで関数から戻ります 関数を呼び出した側はその行に左辺があれば代入し、無ければスタックに積まれたデータを破棄します
- php504
- ベストアンサー率42% (926/2160)
構造体や普通の変数の場合は値のコピーが行われるので戻り値として受け取れますが配列を受け取るのは無理です。
- Tacosan
- ベストアンサー率23% (3656/15482)
まあ, 構造体で返す, くらいかな. 最後の 「構造体の要素が全てint型ならば配列ではダメなのですか?」 の意味がわかりません.