この関数の目的
memmove()は、オブジェクトを、重複するオブジェクト間でも正しくコピーする。
定義
#include <string.h> void *memmove(void *s1, const void *s2, size_t n);
働き
この関数は、 s2 が指すオブジェクトの最初の n 文字を s1 が指すオブジェクトに複写する。 複写は、まず s2 が指すオブジェクトの最初の n 文字が、 s1 が指すオブジェクトとも s2 が指すオブジェクトとも重複しない n 文字分の一時的な配列に複写され、 そこから n 文字が s2 が指すオブジェクトにコピーされるかの様に行われる。
返り値は s1 の値である。
解説
この関数を使うと、以下のような重複するオブジェクト間での転写を正しく行うことができることが保証される。 memcpy() では保証されない。
char str[6] = "hello"; memmove(&str[0], &str[1], 5); /* str は "ello" という内容になる */
規格では一時配列を使う動作ということになっているが、実際にはアドレス値によってコピーする方向を変えることで実装している処理系が多い。