memset()の戻り値の使用は何ですか?


88

memset()void*関数に渡されたアドレスと常に同じ値を返すように宣言されています。

戻り値の用途は何ですか?なぜ戻らないのvoidですか?



2
の戻り値の用途は何strcat()ですか?標準関数は、本来あるべきものでなく、あるべきものとして指定されている場合があります。
DevSolar

4
@MatthieuM .:また、通常、返品に関連するコストはゼロではありません。戻り値がレジスターに収まる場合でも、通常はその値をレジスターにロードする必要があります。これにはコストがかかりますが、わずかです。
NPE

15
@sharptooth:「すべての人間を殺す」関数は、もちろん殺された人間の数を返します。
個人

2
@MatthieuM .: あなたはそのような雑学について心配する必要はありませんが、私は確かにそうするかもしれません。限られたリソースシステム用のコンパイラを作成している場合はどうなりますか?うーん?
Thomas Eding、

回答:


34

署名は、他のすべての同様の機能に沿ったものである:memcpy()strcpy()など私はいつもこれは、そのような関数へのチェーンの呼び出しに1を有効にするために、それ以外の表現でこのような呼び出しを使用するために行われたと思いました。

とは言っても、そのような方法で戻り値を使用せざるを得ないような現実の状況に遭遇したことはありません。


121

次のような呼び出しの連鎖に使用できます。

char a[200];
strcpy(memset(a, 0, 200), "bla");

9
はい、それは間違いなく「連鎖」のユースケースです。
Cartesius00

6
興味深い事例なので、私は回答を賛成しました。しかし、実際には、memsetとstrcpyの呼び出しを分離しておく方が良いと思います。
Tsvetomir Dimitrov

24
Cプログラマーは判読不能なコードが大好きなので、標準関数を設計する場合は無限連鎖を可能にする必要があります。
Chad Schouggins

@ChadSchougginsいくつかのhaskellコードを読むと、cプログラマーは実際にはまったく逐語的であることがわかります;)(regex "operator"の考え=〜)...
BitTickler

もちろん、この例ではstrcpy、最後にコピーされたポインタを超えてポインタを返すことは、逆に言えば、もっと理にかなっているでしょう。memset(my_strcpy(a, "bla"), 0, a + 200);(C ++ std::copy_nと同様std::fill_n)。
alfC

12

関数を次のような別の関数の引数として使用するには sprintf


0

Googlingでmemsetが何を返すかを確認するときにこの質問に出くわしました。

1つの値をテストするコードがあるので、それが真の場合、値がゼロかどうかを確認します。

Cにはゼロをテストする完全に移植可能な方法がないため、memsetを途中で実行する必要があります。

だから私のコードは:

if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )

これは、前の質問で挙げた連鎖の目的を物語っていますが、この手法の使用例です。

これが適切なコーディングであるかどうかを判断するのは、他の人に任せます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.