• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【C言語】戻り値が構造体の関数)

【C言語】戻り値が構造体の関数

このQ&Aのポイント
  • C言語で構造体の戻り値を扱う関数について質問があります。
  • 特定の関数で構造体を返す際にエラーが発生し、正しい返り値の扱い方を知りたいです。
  • 関数名に存在する間接演算子についても疑問を持っています。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.6

ポインタはややこしいですが、&や*が付いたらどんな型になるかを落ち着いて考えましょう。 > Person *bin_search( const Person *key) *がbin_search, keyに付いてますが、考え方としては 「Person *」を返す関数「bin_search」 「const Person *」型の引数「key」です。 とすると、 「&key」は「『const Person *』型へのポインタ(const Person **)」になるので、戻り値の「Person *」とは一致しません。それが > return from incompatible pointer type (互換性の無いポインタを返した)というエラーです。 「*key」は「『const Person *』型(= const Personへのポインタ)から参照される実体(const Person)」になるので、戻り値の「Person *」とは一致しません。そもそもポインタでは無いので、エラーメッセージも違っているはずです。 では、「key」はなにか、と言えば、「const Person(=変更できないPerson)へのポインタ」です。 戻り値は「Person(=変更もできるPerson)へのポインタ」なので「一致しません」 Person * → const Person *は暗黙の型変換が行われます。これは、参照先を読み書きできるように扱うか、読み込みのみで扱うかの違いなので、問題はありません。 しかし、逆はできません。 対処法は次のようなものがあります。それぞれに一長一短です。他の部分との組合せ等から、適切なものを選んでください。 ・戻り値をconst Person *にする。 ・引数をPerson *にする。 ・return時に Person *へキャストする。 > warning: function returns address of local variable これは別の話しです。 keyは、この関数が呼ばれたときに確保され、関数から戻ったら解放される「(関数内で自動の)ローカル変数」です。 &keyは、そのローカル変数のアドレスを示します。 そのローカル変数が解放されたら、その領域がどうなるかはわかりません。すぐに別の変数がその領域を使ってしまうかもしれません。 なので、「受け取ったアドレスが無意味になってるかもしれませんよ。大丈夫ですか?それを意図したプログラムですか?」という警告です。

stiyl
質問者

お礼

丁寧で細かい説明ありがとうございました。 おかげでプログロムは無事実行することが出来ました。

その他の回答 (11)

  • TT414
  • ベストアンサー率18% (72/384)
回答No.1

>return (key); >などとりあえず試してはみたのですがどれも上手くいきません。 とありますが「return (key);」の場合「const*」を「*」に変えたというワーニングがでるだけで正しく動くと思いますが?どういった風に上手く行かなかったのでしょうか? keyには構造体のアドレスが入っています、関数の返却値も同一構造体のアドレスです。そのままkeyを返せば良いだけです。

stiyl
質問者

お礼

回答ありがとうございました。 おかげでプログロムは無事実行することが出来ました。

stiyl
質問者

補足

「return (key);」の場合、 return discards qualifiers from pointer target type という警告文が表示されました。 これが、そのワーニングにあたるのでしょうか?

関連するQ&A