Это расширенный комментарий, а не ответ. Пример MSDN - неудачный, сбитый с толку двумя похожими исходными строками: «Быстрая коричневая лиса перепрыгивает через ленивую собаку» и «Быстрая коричневая собака перепрыгивает через ленивую лису». Мой MS Visual C дает правильный результат с memcpy()
, когда источник и место назначения перекрываются, но, как писал @PaulRoub (теперь удален), только потому, что один компилятор кодирует это правильно, не означает, что другой будет.
#include <stdio.h>
#include <string.h>
int main()
{
char str [] = "abcdefghijklmnopqrstuvwxyz";
printf ("%s\n", str);
memcpy (str, str+1, 25); // copy down
printf ("%s\n", str);
memcpy (str+1, str, 25); // copy up
printf ("%s\n", str);
return 0;
}
Программный вывод
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyzz
bbcdefghijklmnopqrstuvwxyz
person
Weather Vane
schedule
02.01.2015
Function: memmove with overlap … Result: The quick quick brown fox jumps over the lazy dog
по сравнению сFunction: memcpy with overlap … Result: The quick quick brown dog jumps over the lazy fox
. Кроме того, использованиеmemcpy()
для перекрывающихся данных приводит к неопределенному поведению, включая возможность «работы, как ожидалось». - person Jonathan Leffler   schedule 02.01.2015