«Перекрытие памяти» не возникает само по себе. Именно вы можете снабдить функцию memmove
областями памяти, которые перекрываются. Возьмите два указателя в один и тот же массив , и вы можете легко получить перекрывающиеся области памяти.
Конечно, вы также можете легко создавать перекрывающиеся объекты через объединения.
Непонятно, что вы подразумеваете под второй частью вопроса («как эта функция все еще может правильно копировать блок памяти»). Где вы видите проблему здесь?