memcpy()는 문자열이 겹칠 때 문제가 발생합니다. 예를 들어 아래 프로그램을 고려하십시오. 다음 예제에서는 memmove() 함수의 사용을 보여 주었습니다. 우리가 컴파일하고 다음과 같은 결과를 생성합니다 위의 프로그램을 실행하자 – . 개체가 잠재적으로 겹치거나 Trivially복사할 수 없는 경우 memmove의 동작이 지정되지 않고 정의되지 않을 수 있습니다. 임시 버퍼가 사용되는 것처럼 ”마치”라고 지정되었음에도 불구하고 이 함수의 실제 구현은 이중 복사 또는 추가 메모리의 오버헤드를 발생시키지 않습니다. 작은 수의 경우 레지스터를 로드하고 쓸 수 있습니다. 큰 블록의 경우 일반적인 접근 방식(glibc 및 bsd libc)은 대상이 소스 보다 앞에서 시작되는 경우 버퍼의 시작 부분에서 바이트 전달을 복사하고, 그렇지 않으면 끝에서 뒤로 하여 중복이 없을 때 std::memcpy로 다시 떨어지는 것입니다. C 라이브러리 함수 void *memmove (void *str1, const void *str2, size_t n) str2에서 str1까지 n 문자를 복사하지만 메모리 블록이 겹치는 경우 memmove()는 memcpy()보다 더 안전한 방법입니다. str1 – 이것은 콘텐츠가 복사될 대상 배열에 대한 포인터이며, 형식 보이드*의 포인터에 형식 캐스팅됩니다. 다음은 memmove() 함수에 대한 선언입니다. 입력 주소가 겹치기 때문에 위의 프로그램은 원래 문자열을 덮어쓰고 데이터 손실을 일으킵니다. memcpy()와 어떻게 다른가요? memcpy()는 단순히 한 위치에서 다른 위치로 데이터를 하나씩 복사합니다.

반면에 memmove()는 데이터를 먼저 중간 버퍼로 복사한 다음 버퍼에서 대상으로 복사합니다. 개체가 겹칠 수 있습니다: 복사는 문자가 임시 문자 배열로 복사된 다음 문자가 배열에서 가장 큰 것으로 복사된 것처럼 수행됩니다. 복사본은 src로 가리키는 개체에서 dest가 가리키는 개체에 문자를 계산합니다. 두 개체 모두 서명되지 않은 char의 배열로 다시 해석됩니다.

memmove 예제