Второй аргумент в прототипах для memmove/memcpy/strcpy аналогичен: Например:
void *memmove(void *dest, const void *src, size_t n); //const void*
char *strcpy(char *dest, const char *src); //const char*
Но очевидно, что если dest и src перекрываются, то содержимое src будет изменено, нарушая условие const void/char *?