そもそも、memcpyとmemmove関数の違いは何かというと、前者はコピー元とコピー先の領域に重複があると暴走する可能性がありますが、後者は大丈夫という点です。
errno_t memmove_s( void *dest, size_t sizeInBytes, const void *src, size_t count );destは、コピー先のバッファです。
sizeInBytesは、コピー先のバッファサイズです。
srcはコピー元です。
countは、コピーするバイト数です。
では、次のような例ではどうなるか考えてみましょう。
char str[64] = "猫でもわかる魚釣りプログラミング \n";これに対して、コピー先バッファをstr + 12とします。
すると、コピーは「猫でもわかる魚・・・」の「魚」のところから始まります。
バッファサイズは、strのサイズより12バイト減ります。
本当に、このようになるのでしょうか。実験してみましょう。
/* memmove01.c */ #include <stdio.h> #include <string.h> int main() { char str[64] = "猫でもわかる魚釣りプログラミング \n"; memmove_s(str + 12, sizeof(str) - 12, str + 18, 20); printf(str); }では、結果を見てみましょう。
やはり、予想通りの結果となりましたね。
memmove_s関数は、あまり使う機会がないかもしれません。しかし、知っていると重宝することもあると思われます。
Update Sep/03/2007 By Y.Kumei