살구월드

잠깐, 리눅스, C 언어, Java, Python 등
각종 예제 검색하기

이전에 배운 memcpy 함수는 한 메모리 공간의 값을 다른 공간으로 복사하는 역할을 하였습니다.
오늘은 복사가 아닌 한쪽 공간의 값을 그대로 다른 공간으로 이동시키는 방법에 대해 알아보겠습니다.
이러한 API 명은 바로 memmove입니다.
이름에서 바로 알 수 있듯이 memory + move의 약자입니다.
이 memmove 함수는 memcpy와 비슷한 역할을 함으로써 메모리 공간을 관리해 줍니다.

있던 것을 다른 곳으로 이동시키는 컨베이어벨트와 비슷?

 

memmove 함수 원형은?


memmove 함수는 <string.h> 헤더 파일에 선언되어 있으며, 다음과 같은 원형을 갖습니다


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

 

 

 

memmove 인자는?


memmove 함수는 아래와 같은 인자들을 받습니다. 각 인자에 대해 알아보도록 하겠습니다.

dest: 소스 메모리 공간의 값이 이동할 도착지 메모리 영역 주소 포인터
src: 도착지 메모리 영역에 이동시킬 값이 존재하는 기존 메모리 영역 주소 포인터
n: 이동할 바이트 수를 나타내는 정수



위와 같은 인자들을 전달하여 메모리 공간의 값을 이동시키게 됩니다.


 

memmove 언제 사용하나?


memmove 함수는 한 메모리 영역의 데이터를 다른 메모리 위치로 이동해야 할 때 사용됩니다.
대상 메모리 영역과 소스 메모리 영역이 겹치는 경우에도 안전하게 이동할 수 있어, 메모리 블록의 중첩된 이동이 필요한 경우에 주로 사용됩니다.
배열, 구조체, 포인터 등의 메모리를 이동해야 할 때 memmove 함수를 사용할 수 있습니다.

 

memmove 다른 배열의 값 이동시키는 예제


아래는 memmove 함수를 사용하여 다른 배열의 값을 이동시키는 예제입니다.

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

int main() {
    int s[3] = {1, 2, 3};
    int d[3];
    
    memmove(d, s, sizeof(s));
    
    for (int i = 0; i < 3; i++) printf("%d ", d[i]);
    return 0;
}

 

 



위의 예제에서는 s 배열의 값을 memmove 함수를 사용하여 d 배열로 이동시킵니다.
sizeof(s)를 통해 배열의 크기를 전달하므로, 배열의 모든 요소를 이동할 수 있습니다.
결과적으로 d 배열은 s 배열의 값으로 이동되어 출력됩니다.

메모리 이동과 복사의 차이

 

memmove 두 배열의 문자열을 한 블록에 이어 붙이는 예제


다음은 memmove 함수를 사용하여 두 배열의 문자열을 한 블록에 이어 붙이는 예제입니다

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

int main() {
    char string1[] = "Hello ";
    char string2[] = "World!";
    char string3[20];
    
    memmove(string3, string1, strlen(string1));
    memmove(string3 + strlen(string1), string2, strlen(string2));
    
    printf("%s\n", string3);
    return 0;
}



위의 예제에서는 string1 string2 배열의 문자열을 각각 memmove 함수를 사용하여 string3 배열에 이어 붙입니다.
조심해서 사용해야 하는 이유는 메모리공간을 직접 조작하는 것이기 때문에 이어 붙일 목적지 주소가 정확해야 합니다.
지금 위의 예제에서도 string1을 붙인 이후에는 string1 문자열 길이만큼 string3 뒤쪽에 string2를 이어 붙이고 있습니다.
따라서 위의 예제를 실행하면 "Hello World!" 문자열이 출력됩니다.

 

memmove 함수는 memcpy함수와 비슷한 기능을 합니다.
다만, mem 관련 함수들은 메모리 공간을 조작할 수 있기 때문에 항상 복사할 대상의 주소 포인터를 잘 확인하고 사용하여야 합니다.

잠깐, 리눅스, C 언어, Java, Python 등
각종 예제 검색하기

공유하기

facebook twitter kakaoTalk kakaostory naver band