Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ memmove() 함수 완벽 정리: 메모리 블록 이동 방법


memmove() 함수는 메모리 블록 전체를 한 위치에서 다른 위치로 이동시키는 데 사용됩니다. 두 개의 포인터가 필요하며, 하나는 원본(소스)을 가리키고 다른 하나는 대상(목적지)을 가리킵니다. 이 함수는 C 언어의 string.h 헤더 파일에 선언되어 있습니다.

C 언어에서 memmove() 함수의 문법은 다음과 같습니다.

void *memmove(void *dest_str, const void *src_str, size_t number)

각 매개변수의 의미는 다음과 같습니다.

dest_str − 복사된 데이터가 저장될 대상 배열을 가리키는 포인터입니다.

src_str − 복사할 데이터가 있는 원본 배열을 가리키는 포인터입니다.

number − 원본에서 대상으로 복사할 바이트 수입니다.

다음은 C 언어에서 memmove() 함수를 사용한 예제입니다.

예제

#include <stdio.h>
#include <string.h>
int main () {
    char a[] = "Firststring";
    const char b[] = "Secondstring";
    memmove(a, b, 9);
    printf("New arrays : %s\t%s", a, b);
    return 0;
}

실행 결과

New arrays : SecondstrngSecondstring

위 프로그램에서는 char 타입의 두 배열을 초기화한 후, memmove() 함수를 호출하여 원본 문자열 'b'를 대상 문자열 'a'로 복사합니다.

char a[] = "Firststring";
const char b[] = "Secondstring";
memmove(a, b, 9);

이 예제에서는 9바이트만큼만 복사하므로, 배열 'a'의 앞 9글자는 "Secondstr"로 대체되고 나머지 부분("ng")은 그대로 유지되어 최종적으로 "Secondstrng"가 됩니다. 반면 원본 배열 'b'는 memmove()에 의해 변경되지 않고 그대로 유지됩니다.

memmove()와 memcpy()의 차이점

memmove()와 비슷한 기능을 하는 함수로 memcpy()가 있지만, 두 함수 사이에는 중요한 차이가 있습니다. memcpy()는 원본과 대상의 메모리 영역이 서로 겹치는 경우(overlapping) 정의되지 않은 동작(undefined behavior)을 일으킬 수 있습니다. 반면 memmove()는 메모리 영역이 겹쳐도 안전하게 동작하며, 내부적으로 임시 버퍼를 활용하거나 복사 순서를 조절하여 데이터 손상을 방지합니다. 따라서 원본과 대상 메모리가 겹칠 가능성이 있다면 항상 memmove()를 사용하는 것이 안전합니다.