일상 메모장

memmove 사용법 및 구현 - C 메모리 이동 본문

C 언어

memmove 사용법 및 구현 - C 메모리 이동

핸드오버 2020. 1. 29. 07:13

사용법

#include <string.h>

void *memmove(void *dest, const void *src, size_t n);

정의

memmove() 함수는 src 메모리 영역에서 dest 메모리 영역으로 n byte 만큼 복사합니다.

src 배열은 src와 dest 의 메모리 영역과 겹치지 않는 메모리 영역부터 먼저 복사합니다.

반환 값

dest 의 포인터를 반환합니다.

 

memcpy() 구현 (memcpy 실제 구현부)

/**
 * memmove - Copy one area of memory to another
 * @dest: Where to copy to
 * @src: Where to copy from
 * @count: The size of the area.
 *
 * Unlike memcpy(), memmove() copes with overlapping areas.
 */
void *memmove(void *dest, const void *src, size_t count)
{
        char *tmp;
        const char *s;

        if (dest <= src) {
                /*
                 * src 의 주소가 dest 보다 큰 값이면,
                 * src 의 처음 부터 count 만큼 dest 에 복사한다.
                 * src를 한 byte씩 복사하더라도 dest 보다 큰 위치에 있기 때문에,
                 * 오버랩되더라도 src 를 모두 정상적으로 dest에 복사할수 있다.
                 */
                tmp = dest;
                s = src;
                while (count--)
                        *tmp++ = *s++;
        } else {
                /*
                 * src의 주소가 dest 보다 작은 값이면,
                 * src 의 마지막 데이터부터 한바이트씩 dest의 마지막 바이트부터
                 * 순서대로 복사한다.
                 */
                tmp = dest;
                tmp += count;
                s = src;
                s += count;
                while (count--)
                        *--tmp = *--s;
        }
        return dest;
}

 

char array[10] 배열이 있고 [2]~[5] 까지 test 라는 문자열을 array[0]으로 옮기는 예를 들으면,

memmove(array, array + 2, 4); 이렇게 되면 dest 는 src보다 작은 값을 가지게 됩니다.

그러므로 위 코드대로 src 첫번째 byte부터 순차적으로 dest 에 한 byte씩 복사하게 됩니다.

위와 반대로 char array[10] 배열이 있고 [0] ~ [3] 까지 test 라는 문자열을 array[2]로 옮기는 예를 들으면,

memmove(array + 2, array, 4); 이렇게 되면 dest 는 src 보다 큰 값을 가지게 됩니다.

그러므로 src 마지막 바이트부터 한 byte씩 순차적으로 dest 에 복사합니다.

예제

#include <string.h>
#include <stdio.h>
 
int main(void)
{
        char array[10];
        
        memset(array, 0, sizeof(array));
        strcpy(array, "test");
        
        printf("original : %s\n", array);
        
        memmove(array+2, array, strlen("test"));
        
        printf("after memmove : %s\n", array);
        
        return 0;
}

결과값은

original : test

after memmove : tetest

입니다.