void *memcpy(void *restrict dst, const void *restrict src, size_t n);
restrict означает «данные этого указателя не пересекаются с другими данными в текущей области видимости», что определяет каким образом memcpy() планирует обрабатывать её параметры. Если при копировании указатель на место назначения, частично перекрывает указатель на место откуда берутся данные, нужно использовать функцию memmove(), её прототип не содержит квалификаторов restrict.
void *memmove(void *dst, const void *src, size_t len);