みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語 関数が文字列を含む構造体を返すとき

生徒名、テストの点数
を要素とする構造体

struct test{char name[10];int score;};

を定義し、
点数の大きいほうを返す関数

struct test Top(struct test test1,struct test test2)
{
if(test1.score > test2.score)
return test1;
else
return test2;
}

を定義しました。(この状態では同点のとき後者を返してしまいますが)

main関数内で

struct test test1;
struct test test2;
strcpy(test1.name,"yamada");
test1.score=70;
strcpy(test2.name,"tanaka");
test2.score=90;

と宣言・代入したあと、Top関数が返した点数と名前を表示したいのですが、
名前の表示がうまくいってくれません。
文字配列の操作が誤っているのでしょうか?

実行したのは次の操作です。
printf("Top score = %d\n",Top(test1,test2).score);
printf("Top man = %c\n",Top(test1,test2).name[0]);
printf("Top man = %s\n",Top(test1,test2).name);

Top score = 90
Top man = t
Top man = tanaka
と表示されるのを期待していたのですが、
前二つの表示が終わるとダンプを起こしてしまいます

投稿日時 - 2012-04-27 20:43:14

QNo.7444638

すぐに回答ほしいです

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

>文字配列の操作が誤っているのでしょうか?

文字配列の操作が間違ってるのではなくて
構造体の戻り値の扱い方が間違ってます。

>printf("Top man = %s\n",Top(test1,test2).name);

printf()が処理しようとするときにはTop()の返す構造体の寿命は尽きてる。

投稿日時 - 2012-04-27 21:02:24

お礼

ありがとうございます。
なぜできていないのかよく分かりました。

投稿日時 - 2012-04-27 21:46:13

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

例えば最後の部分をこうします。

struct test test3 = Top(test1,test2);
printf("Top score = %d\n",test3.score);
printf("Top man = %c\n",test3.name[0]);
printf("Top man = %s\n",test3.name);

理由はANo.1さんの言われる通り。

関数Topは構造体を(確保されたメモリへの参照ではなく)値で返しています。値をどこかに代入しておかないと、破棄されてアクセスできなくなってしまいます。

投稿日時 - 2012-04-27 21:25:09

お礼

解説ありがとうございます。
おかげさまで解決しました。

投稿日時 - 2012-04-27 21:43:00

あなたにオススメの質問