8

読書中:カウンターを使用せずに、配列の要素がすべて同じであることを確認するにはどうすればよいですか? 、@Skizz は気の利いたソリューションを使用します。

memcmp (&string [0], &string [1], sizeof string [0] * (N - 1))

したがって、N がたまたま 1 の場合、次のようになります。

memcmp (&string [0], &string [1], 0)

コンペア長が0のとき戻り値は必ず0ですか?


テスト ケース (Cygwin gcc バージョン 4.8.1 Windows 64 ビット) が返されます0。だから私はこれと他のいくつかのコンパイラ/プラットフォームでそれが0であることを知っています.

printf("%d\n", memcmp("foo", "bar", 0));

C11 ドラフト仕様が続きますが、この問題については静かに見えます。たぶん、仕様の別の部分か何かが何かを言っているのでしょうか?

7.24.4.1 memcmp
関数

#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);

説明
memcmp 関数は、s1 が指すオブジェクトの最初の n 文字と、s2 が指すオブジェクトの最初の n 文字を比較します。

戻り値
memcmp 関数は、s1 が指すオブジェクトが s2 が指すオブジェクトより大きい、等しい、または小さいため、ゼロより大きい、等しい、または小さい整数を返します。


(&string [1] が不正なメモリを参照していないと仮定します)

4

1 に答える 1

14

仕様の関連部分は実際にはこれです

7.21 文字列の扱い

7.21.1 文字列関数の規則

2 size_t nとして宣言された引数が関数の配列の長さを指定する場合、nはその関数の呼び出しで値 0 を持つことができます。この節の特定の関数の説明で明示的に別段の記載がない限り、7.1.4 で説明されているように、そのような呼び出しのポインター引数は引き続き有効な値を持つものとします。このような呼び出しでは、文字を検索する関数はオカレンスを検出せず、2 つの文字シーケンスを比較する関数は 0 を返し、文字をコピーする関数は 0 文字をコピーします。

これはmemcmp、指定されたシーケンス長がゼロの場合、 がゼロを返すことが保証されていることを意味します。

于 2013-09-26T18:01:36.453 に答える