- ベストアンサー
【C言語】戻り値が構造体の関数
- C言語で構造体の戻り値を扱う関数について質問があります。
- 特定の関数で構造体を返す際にエラーが発生し、正しい返り値の扱い方を知りたいです。
- 関数名に存在する間接演算子についても疑問を持っています。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
ポインタはややこしいですが、&や*が付いたらどんな型になるかを落ち着いて考えましょう。 > 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は、そのローカル変数のアドレスを示します。 そのローカル変数が解放されたら、その領域がどうなるかはわかりません。すぐに別の変数がその領域を使ってしまうかもしれません。 なので、「受け取ったアドレスが無意味になってるかもしれませんよ。大丈夫ですか?それを意図したプログラムですか?」という警告です。
その他の回答 (11)
- TT414
- ベストアンサー率18% (72/384)
>return (key); >などとりあえず試してはみたのですがどれも上手くいきません。 とありますが「return (key);」の場合「const*」を「*」に変えたというワーニングがでるだけで正しく動くと思いますが?どういった風に上手く行かなかったのでしょうか? keyには構造体のアドレスが入っています、関数の返却値も同一構造体のアドレスです。そのままkeyを返せば良いだけです。
お礼
回答ありがとうございました。 おかげでプログロムは無事実行することが出来ました。
補足
「return (key);」の場合、 return discards qualifiers from pointer target type という警告文が表示されました。 これが、そのワーニングにあたるのでしょうか?
- 1
- 2
お礼
丁寧で細かい説明ありがとうございました。 おかげでプログロムは無事実行することが出来ました。