Дело не в том, что компилятор создает переменные, которые перекрываются. Просто спецификация memmove
говорит, что она должна работать, даже если источник и пункт назначения перекрываются. Если нет шансов на перекрытие двух, вы обычно хотите использовать memcpy
, который обычно будет быстрее, но дает неопределенное поведение, если они перекрываются.