void *memmove(void *dest, const void *source, size_t n); 메모리를 이동하는 함수
입력 매개 변수 리스트
dest 이동 대상 버퍼
source 이동할 원본
n 이동할 바이트 수
반환 값
dest
memmove 함수도 memcpy 처럼 메모리의 내용을 다른 메모리로 옮기는 함수입니다. memmove 함수 내부에서는 이동할 데이터를 임시 버퍼에 옮긴 후에 대상 버퍼로 이동하여 옮길 데이터가 있는 버퍼와 대상 데이터 버퍼가 근접하더라도 중첩 현상이 발생하지 않습니다.
memcpy 함수는 근접했을 때 중첩 현상이 발생할 수 있습니다. 예를 들어 memcpy(base, base+1,n) 이나 memcpy(base+1, base,n)과 같은 호출은 원본 버퍼와 대상 버퍼의 위치가 근접하므로 중첩 현상이 발생할 수 있습니다. 컴파일러에 따라 이와 같은 현상을 없애 memmove와 같은 결과를 갖게 구현하기도 합니다.
따라서 메모리를 복사할 때 memcpy 함수보다는 memmove 함수가 신뢰성이 높습니다.
사용 예
//C언어 표준 라이브러리 함수 가이드 //void *memmove(void *dest,const void *source, size_t n); 메모리를 이동하는 함수 //배열에서 n-1 개의 원소를 한 칸씩 뒤로 이동, 원래 자리는 0으로 설정 #include <string.h> #include <stdio.h> int main(void) { int i; int arr[10]={1,2,3,4,5,6,7,8,9,10}; printf("== 이동 전 ==\n");//이동 전 arr의 원소들 출력 for(i=0;i<10;i++) { printf("%d ",arr[i]); } printf("\n"); memmove(arr+1,arr,sizeof(int)*9);//arr에 있는 int 형식 원소 9개를 arr+1로 이동 arr[0] = 0; //arr[0]을 0으로 설정 printf("== 이동 후(빈자리는 0으로 채움) ==\n");//이동 전 arr의 원소들 출력 for(i=0;i<10;i++) { printf("%d ",arr[i]); } printf("\n"); return 0; }
출력
== 이동 전 == 1 2 3 4 5 6 7 8 9 10 == 이동 후(빈자리는 0으로 채움) == 0 1 2 3 4 5 6 7 8 9