1. ホーム
  2. c++

[解決済み] memcpy()とmemmove()をバイト数をゼロにして呼び出すことは可能ですか?

2022-05-14 08:17:09

質問

実際に移動/コピーするものがない場合、次のような処理が必要ですか? memmove() / memcpy() エッジケースとして

int numberOfBytes = ...
if( numberOfBytes != 0 ) {
    memmove( dest, source, numberOfBytes );
}

をチェックせずに関数を呼び出せばよいのでしょうか?

int numberOfBytes = ...
memmove( dest, source, numberOfBytes );

前者のスニペットのチェックは必要でしょうか?

どのように解決するのですか?

C99規格(7.21.1/2)より。

として宣言された引数が size_t n は配列の長さを指定します。 関数の配列の長さを指定します。 n はその関数の呼び出し時に値ゼロを持つことができます。このサブセクションの特定の関数の説明で明示的に記述されていない限り このサブクラスにおける特定の関数の説明で他に明示されていない限り,そのような呼び出しにおけるポインタ引数 は,7.1.4で記述するように,依然として有効な値をもたなければならない。このような呼び出しにおいて このような呼び出しにおいて,文字の位置を特定する関数は発生を発見できず,2つの文字列を比較する関数はゼロを返し 文字列を比較する関数はゼロを返し,文字をコピーする関数はゼロをコピーする。 文字をコピーする関数はゼロをコピーします。

つまり、答えはノーです。チェックは必要ありません(またはイエスです。ゼロを渡すことができます)。