The second arg in the prototypes for memmove/memcpy/strcpy are similar: For example:
void *memmove(void *dest, const void *src, size_t n); //const void*
char *strcpy(char *dest, const char *src); //const char*
But apparently, if dest and src overlap, then src's content will be altered, violating the const void/char *?