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 *?
const void*
means that the referand will not be modified through that pointer.
If there are other, non-const pointers to the same object (also known as "aliasing"), then of course it can still be modified through those. In the scenario you describe, that other pointer is dest
.
By the way, in the case of strcpy
, behavior is undefined if the regions overlap, and in C99 the signature is char *strcpy(char * restrict s1, const char * restrict s2);
. But for memmove, aliasing is OK. By giving it overlapping regions you've given it "permission" to modify the dest
region, and it will do that.