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
입니다.