Второй аргумент в прототипах для 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 *?