プロが教えるわが家の防犯対策術!

C言語:関数の返り値と引数について

C言語の関数を作るとき、ほしい値とかを引数にして渡す場合と、そのまま返り値で渡す場合の二種類がありますよね?
例えば、
・void Smooth( Image *src, Image *dst, int param );
・Image *Smooth( Image *src, int param );
みたいな感じで

mallocとかは返り値で渡してますけど、opencvの関数(例えばcvSmooth)とかは引数にしてます
これって使い分けとかあるんでしょうか?

A 回答 (6件)

私は大きな構造体の場合はポインタの引数にして受け取ります


(返り値で受け取ると値のコピーが無駄なので)
    • good
    • 0
この回答へのお礼

それは返り値をポインタにすればいいような…

ありがとうございました

お礼日時:2010/07/23 14:38

特に規則はないと思います。

好みの問題でしょう。
mallocの結果だって、引数で返す場合もあります。
void xx(void **p) {
    *p = malloc(2048);
}
    • good
    • 0
この回答へのお礼

まぁそれは確かにできますね
やっぱり好みの問題ですか

ありがとうございました

お礼日時:2010/07/23 14:39

戻したい値が二つ以上ある場合には,引数にする。


戻したい値が一つの場合には,戻り値にする。
というのが基本だと思います。とはいえ,これを無視して逆のやり方をすることも可能です。
戻したい値が二つ以上ある場合でも,構造体を用意して,関数内でその構造体に代入して戻り値にする。
戻したい値が一つの場合でも,引数にして戻り値を使わない。
結局のところ,ローカルルールで決めているだけですね。
    • good
    • 0
この回答へのお礼

やっぱりローカルルールで決めてるだけなんですね

ありがとうございました

お礼日時:2010/07/23 14:40

返すデータの数とか種類、意味合いとかによって様々でしょう。



(1)単独の値を返す場合
 関数の返り値だけで事足ります。

(2)複数の結果を返さなければならない場合
 構造体を返り値にするという方法もありますが、一般的な変数型の値が2、3個の場合は結果の格納先のポインタを貰う形の方がわかりやすいということもあります。

(3)ある程度の容量を必要とするデータを返す場合
 関数内でmallocとかしてそのポインタを返すとかいう方法もありますが、返した先でメモリのサイズがわからないとか、freeし忘れがちになるとかいうことが起こるので、明示的に呼び元で領域確保した先に書き込む方が安全です。

(4)使い分け
 関数の処理の成否を返り値で返し、処理結果そのものは指定のポインタ先に格納するというものもあります。

 要は関数の設計しだいですが、一般的には(1)のような場合は返り値で返す方が好まれます。返り値で返した場合は関数の呼び出しそのものを分岐の評価式とすることができますが、アドレスを引数で渡すものはワンクッション置かなくてはなりません。(4)もそのような感じかな。
    • good
    • 0
この回答へのお礼

なるほど…
確かに、処理の成否を返したりする場合は結構ありますね

ありがとうございました

お礼日時:2010/07/23 14:42

関数内で動的に確保する場合はポインタで受けとれますがそうでない場合はポインタ引数で受け渡しになるということです

    • good
    • 0
この回答へのお礼

あぁ、なるほど
そういうことですか

ありがとうございました

お礼日時:2010/07/23 19:20

既にいろいろでているので、OpenCVに関して。



cvSmooth等はIn-Placeの変換(入力画像を結果を出力する)ができます。
他の(ガベージコレクション などで)自動解放する言語や、 = をオーバライドしてin-place版を実行できる言語なら
src = Smooth(src) ;
でもいいのですが、Cの場合、こんなことをしたら、実行前にsrcに入っていた領域が参照できなくなります。
参照できなければfreeできません。

void Smooth( Image *src, Image *dst, int param );
の型なら、 src == dst かどうかで、In-Placeかどうかを判定できます。
    • good
    • 0
この回答へのお礼

なるほど
確かに、src=Smooth(src)の場合はそうなりますね
納得です

ありがとうございました

お礼日時:2010/07/24 13:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!