2016-10-28 4 views
1

最近読まれたマニュアルページはgetcwd(3)です。現在の作業ディレクトリを渡されたbufポインタに書き出し、それをcharへのポインタとして返します。 2つの方法で結果を出す理由を説明してください。なぜいくつかの関数は戻り値とポインタ渡しの両方で結果を返すのですか?

+0

ちょっと便利です。 –

+0

指定されたポインタがNULLの場合、ポインタアドレスが変更される可能性があります。 –

+0

このような関数を探す必要はありません。 'strcpy()'、 'strcat()'とその親戚も同じです。 –

答えて

3

多くの関数は、指定された引数のバッファではなく、自分自身を割り当てるに書き込みます。

しかし、呼び出し元が関数呼び出しを連鎖させる場合など、直接結果を使用すると便利なことがよくあるので、これらの関数は時にはポインタをさらに返します渡されたのと同じバッファにコピーします。例:

char buf[256] = "foo"; 
puts(strncat(buf, "bar", sizeof buf - strlen(buf) - 1)); 
+0

なぜ 'strncat()'を使用していますか? 'sizeof buf - 1'を渡すのは間違っているので、' sizeof buf - 1 - strlen(buf) 'でなければなりません。 'strncat()'セマンティクスはエラーが発生しやすく、もちろん 'strncpy()'セマンティクスはさらに悪化します。 – chqrlie

+0

@chqrlie修正済みです。 ( 'strcat' /' strcpy'/'stncpy'が悪いと考えるので' strncat'を使用しました) – jamesdlin

0

ポインタを使用する特定の関数から複数の結果を返す必要がある場合。 1つの値だけが返される場合、ポインタは必要ありません。 時刻を取得する関数を記述したとします。時間は時、分、秒です。あなたの関数は3つの値を返す必要があるため、ある場所(または構造体)のアドレスを渡すと、関数はアドレスを埋めてそれをあなたに返します。 srtcatとのstrcmpなどと

同じ作品が...

+1

元の質問が何らかの関数が*同じこと*複数の方法を返す理由であると思われるとき、これは受け入れられた答えであることは奇妙に思えます。 – jamesdlin

+0

は 'strcat'と同じですが、' strcmp'とは同じではありません。 – chqrlie

+0

はいstrcmpは整数値を返します。 –

1

これは関数連鎖の1つです。例えばこれは、しかし

strcat(dest, source); 

として呼び出すことができstrcat

char * strcat (char * destination, const char * source); 

のような関数を考え、あなたは1に3つの文字列を連結する場合、あなたは私が「

dest = strcat(strcat(dest, src1), src2); 
+0

戻り値を 'dest'に格納するのはなぜですか?最高で冗長です。 – chqrlie

1

を連鎖機能を使用することができますこれは複雑な質問に対する正確な答えですが、私の講師は予期せぬプログラムの動作や予期しないランタイムエラーを避けるために存在することをアカデミーに教えてくれました。

正確にはどういう意味ですか?

例えば、ある文字列を 'strcpy'を使って別の文字列にコピーしなければならないとしましょう。
一般的なケースとして、この関数の実装の詳細については説明しませんが、データをヌルポインタから保護する必要があります。
関数呼び出し中に何らかのエラーが発生したとします.Cは例外をほとんど使用しないので、代わりにNullを返します。
返されたnull値を無視するとどうなりますか?
この場合、おそらくランタイムエラーまたは予期しない動作が発生します。

は、このコードを見てみましょう:

char *str1 = ”Hello World”; 
char *str2 = calloc(11, sizeof(char)); 
strcpy(str2, str1); // Error occurs, just part of the string is copied 
if(!strcmp(str1,str2)) 
    printf(”Success”); // Never gets printed - In a more complex example you could't even figure out why 

your'eは必ず何の内部エラーが発生していないように、あなたは常に、一時的なポインタで、このような機能の結果を格納する必要があります。

+0

しかし、なぜいくつかの関数も渡されたポインタに書き込みますか? あなたのケースでは、戻り値のみをカバーします。 –

+1

@Bulat M.まったく同じ理由で - あなたのデータを守るため。これらの関数は、実装固有の目的のために、渡されたバッファを内部的に管理しますが、返された値によって成功したことを示します。私はこの値もintまたはboolかもしれないと思うが、そうでなければ関数呼び出しを連鎖させることはできないだろう。 –

+0

戻り値には関数操作のステータスが含まれ、渡されたポインタは関数の実行結果にポイントしますか? –

関連する問題