[C언어/C++] 메모리 이동 memmove 함수 사용법 & 예제

memmove의 함수는 memory + move의 합성어로 메모리를 이동시키는 목적으로 만들어진 함수입니다. 하지만 실질적인 수행동작은 메모리의 이동이 아닌 메모리의 복사입니다. 실질적인 동작은 앞서 포스팅 했었던 memcpy와 같이 메모리의 값을 복사하는 동작을 똑같이 수행하는데요. 다만 memcpy와는 달리 memmove 함수는 복사할 대상을 버퍼에 복사하고 해당 위치에 가서 버퍼에 복사된 것을 붙여 넣는 식으로 동작이 구현되어있기에 성능은 살짝 떨어지지만 memmove 함수가 더 안정성이 좋습니다. 두 함수의 다른 점은 포스팅의 가장 마지막 부분을 참고해주세요.

 

memmove 함수 사용법

#include <string.h>  //C언어
#include <cstring.h> //C++

void* memmove (void* dest, const void* source, size_t num)

memmove함수를 사용하기 위해서는 먼저 memmove함수가 포함되어 있는 헤더를 포함시켜야 합니다. 헤더는 string.h에도 있고, memory.h에도 memmove함수가 있습니다. 둘중 아무거나 포함해 주세요. memmove함수의 사용법은 memcpy함수와 같습니다.

인자값
dest : 데이터가 복사될 곳을 가리키는 포인터
source : 복사할 데이터가 있는 위치를 가리키는 포인터
num : 복사할 바이트 수

리턴값
dest가 리턴됨

 

memmove 함수 사용 예제

#include <string.h>
#include <stdio.h>

void main()
{
    char source[32] = "복사 대상 메모리";
    char dest[32] = "복사 될 메모리";

    printf("복사 전 : %s\n", dest);

    //src 메모리를 sizeof(src) 만큼 dest로 복사
    memmove(dest, source, sizeof(source));

    printf("복사 후 : %s\n", dest);
}

memmove 예제

위와 같이 memcpy때와 사용법은 완전 동일합니다. 마찬가지로 문자열을 복사할 때는 위의 두가지를 꼭 체크해주시기 바랍니다. 복사될 문자열 크기가 복사될 문자열보다 크기가 작다면 제대로 복사가 되지 않을것이고 또한 복사될 크기에 일부의 크기만 넣는다면 \0문자가 복사되지 않아 문자열이 깨질수도 있습니다. 문자열을 복사할때는 꼭 sizeof() 함수를 사용하여 길이를 넣어주도록 합시다. 만약 문자열의 일부분만 복사하고 싶다면 마지막에 \0문자를 강제로 넣어주셔야 합니다.

 

memmove함수와 memcpy함수의 차이점

memmove함수와 memcpy 함수는 메모리를 복사한다는 공통점이 있습니다. 이 중 memmove함수를 사용해야 할 경우가 있습니다. memmove 함수는 복사된 데이터가 저장될 위치와 복사할 데이터가 저장된 위치가 서로 겹쳐도 원하는 결과를 얻을 수 있습니다. 하지만 memcpy 함수의 경우에는 원하는 결과를 얻을 수 있을 수도 있고 얻지 못할 수도 있습니다. 대신, 속도는 memcpy 쪽이 더 빠릅니다. 정리하자면 메모리가 겹친다면 memmove를, 겹치지 않는다면 memcpy를 사용하는 것이 좋겠습니다.

char temp1[10];
char temp2[10];

memcpy(&temp1[0], &temp2[0], 10); // 가능
memmove(&temp1[0], &temp2[0], 10); // 가능

memcpy(&temp1[0], &temp2[1], 9); // 불가능
memmove(&temp1[0], &temp2[1], 9); // 가능

위와 같이 memmove 함수 내부에서는 이동할 데이터를 임시 버퍼에 옮긴 후에 대상 버퍼로 이동하여 옮길 데이터가 있는 버퍼와 대상 데이터 버퍼가 근접하더라도 중첩 현상이 발생하지 않습니다.

 

[C언어/C++] 메모리 복사 memcpy 함수 사용법 & 예제

댓글

Designed by JB FACTORY