最近読まれたマニュアルページはgetcwd(3)です。現在の作業ディレクトリを渡されたbufポインタに書き出し、それをcharへのポインタとして返します。 2つの方法で結果を出す理由を説明してください。なぜいくつかの関数は戻り値とポインタ渡しの両方で結果を返すのですか?
答えて
多くの関数は、指定された引数のバッファではなく、自分自身を割り当てるに書き込みます。
しかし、呼び出し元が関数呼び出しを連鎖させる場合など、直接結果を使用すると便利なことがよくあるので、これらの関数は時にはポインタをさらに返します渡されたのと同じバッファにコピーします。例:
char buf[256] = "foo";
puts(strncat(buf, "bar", sizeof buf - strlen(buf) - 1));
ポインタを使用する特定の関数から複数の結果を返す必要がある場合。 1つの値だけが返される場合、ポインタは必要ありません。 時刻を取得する関数を記述したとします。時間は時、分、秒です。あなたの関数は3つの値を返す必要があるため、ある場所(または構造体)のアドレスを渡すと、関数はアドレスを埋めてそれをあなたに返します。 srtcatとのstrcmpなどと
同じ作品が...
これは関数連鎖の1つです。例えばこれは、しかし
strcat(dest, source);
として呼び出すことができstrcat
char * strcat (char * destination, const char * source);
のような関数を考え、あなたは1に3つの文字列を連結する場合、あなたは私が「
dest = strcat(strcat(dest, src1), src2);
戻り値を 'dest'に格納するのはなぜですか?最高で冗長です。 – chqrlie
を連鎖機能を使用することができますこれは複雑な質問に対する正確な答えですが、私の講師は予期せぬプログラムの動作や予期しないランタイムエラーを避けるために存在することをアカデミーに教えてくれました。
正確にはどういう意味ですか?
例えば、ある文字列を '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は必ず何の内部エラーが発生していないように、あなたは常に、一時的なポインタで、このような機能の結果を格納する必要があります。
しかし、なぜいくつかの関数も渡されたポインタに書き込みますか? あなたのケースでは、戻り値のみをカバーします。 –
@Bulat M.まったく同じ理由で - あなたのデータを守るため。これらの関数は、実装固有の目的のために、渡されたバッファを内部的に管理しますが、返された値によって成功したことを示します。私はこの値もintまたはboolかもしれないと思うが、そうでなければ関数呼び出しを連鎖させることはできないだろう。 –
戻り値には関数操作のステータスが含まれ、渡されたポインタは関数の実行結果にポイントしますか? –
- 1. なぜ結果を返す関数はいつもErrを返しますか?
- 2. なぜ私の関数は整数の結果ではなく "関数"を返しますか?
- 3. 別の関数を持つ関数から戻り値を取得できないのはなぜですか?
- 4. 私のPython関数が結果を返さないのはなぜですか?
- 5. なぜon( 'changeDate')関数は2つの結果を返しますか?
- 6. .reduce()関数でアキュムレータにプッシュした結果を返すことができないのはなぜですか?
- 7. 戻り値の型としてポインタを持つ関数
- 8. いくつかの関数はPythonではなく戻り値を取るのですか?
- 9. Reduxがアクションの戻り関数にディスパッチを渡すのはなぜですか?
- 10. SAS 9.4文字関数 - なぜ1つのセルが予期しない結果を返すのですか?
- 11. 他の関数を返す関数の戻り値の型は何ですか?
- 12. voidでポインタ関数に戻り値のある関数を割り当てることができないのはなぜですか?
- 13. returnはキャストのないポインタから整数を返す[-Wint-conversion]戻り値
- 14. C++の戻り値とオブジェクトへのユニークなポインタの返り方
- 15. 戻り値の型charでグレードを返さないのはなぜですか?
- 16. なぜこの関数はポインタを返しますか?
- 17. なぜスフィンクサピは結果を返さないのですか?
- 18. swift関数の戻り値が正しく返されない
- 19. ポインタ戻り値の型に対して一連の文字を返すのはなぜですか?
- 20. 関数ポインタの代わりに値(?)で関数を渡す?
- 21. なぜこの検索関数はポインタへのポインタを返しますか?
- 22. 関数がポインタを返すときに、なぜ "初期化は整数からポインタを作る"のですか?
- 23. なぜ私の変数は関数の外で1つの値しか返さないのですか?
- 24. この関数が正しい結果を返さないのはなぜですか?
- 25. 私の関数が予期しない結果を返すのはなぜですか?ここ
- 26. がなぜその戻り値の型関数のthisポインタを返さないため、コンパイラのスローエラーがクラス名&
- 27. なぜ結果が返ってくるのですか?
- 28. なぜいくつかの大きな整数を分割してPythonで奇妙な結果を返すのはなぜですか?
- 29. constexpr関数ではconstポインタへの参照を返すが、コピーを返さないのはなぜですか?
- 30. 値で参照渡しのPHPUnitテスト関数と戻り値
ちょっと便利です。 –
指定されたポインタがNULLの場合、ポインタアドレスが変更される可能性があります。 –
このような関数を探す必要はありません。 'strcpy()'、 'strcat()'とその親戚も同じです。 –