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

C/C++ memcpy() 함수 완벽 정리: 문법부터 실전 예제까지

C/C++ 프로그래밍에서 memcpy() 함수는 한 메모리 공간에서 다른 메모리 공간으로 데이터를 빠르게 복사할 때 사용하는 대표적인 표준 라이브러리 함수입니다. 이 글에서는 memcpy() 함수의 동작 원리, 문법, 매개변수, 반환값은 물론 실제 코드 예제와 주의 사항까지 자세히 알아보겠습니다.

memcpy() 함수란?

memcpy()는 C++ STL의 <cstring> 헤더 파일(C 언어에서는 <string.h>)에 정의된 내장 함수로, 특정 메모리 위치에서 다른 메모리 위치로 지정한 크기만큼의 데이터를 복사하는 데 사용됩니다.

이 함수의 결과물은 데이터의 바이너리(binary) 복사본입니다. 즉, 원본 문자열의 종료 널(null) 문자나 데이터의 경계를 전혀 검사하지 않고 지정된 num 바이트만큼 그대로 복사하기 때문에, 사용자가 복사할 크기를 정확하게 지정하는 것이 중요합니다.

memcpy() 문법

void* memcpy( void* destination, const void* source, size_t num );

매개변수

memcpy() 함수는 다음과 같은 매개변수를 받습니다.

  • destination − 복사한 데이터가 저장될 목적지 메모리의 주소를 가리키는 포인터입니다.
  • source − 복사할 원본 데이터가 저장된 메모리의 주소를 가리키는 포인터입니다.
  • num − 복사할 바이트 수입니다.

반환값

memcpy() 함수는 데이터가 복사된 목적지(destination) 메모리를 가리키는 포인터를 반환합니다.

사용 시 주의 사항

  • 원본(source)과 목적지(destination)의 메모리 영역이 서로 겹치면 정의되지 않은 동작(undefined behavior)이 발생할 수 있습니다. 이 경우에는 memmove() 함수를 사용하는 것이 안전합니다.
  • 목적지 버퍼의 크기보다 큰 값을 num으로 지정하면 버퍼 오버플로우가 발생할 수 있으므로 반드시 버퍼 크기를 확인해야 합니다.

memcpy() 예제 1: 문자열 복사

#include <stdio.h>
#include <string.h>
int main (){
    char str_1[10] = "Tutorials";
    char str_2[10] = "Point";
    puts("string str_1 before using memcpy ");
    puts(str_1);
    memcpy (str_1, str_2, sizeof(str_2));
    puts("\nstring str_1 after using memcpy ");
    puts(str_1);
    return 0;
}

출력 결과

string str_1 before using memcpy
Tutorials
string str_1 after using memcpy
Point

코드 설명

위 예제에서 memcpy(str_1, str_2, sizeof(str_2))는 str_2 배열의 전체 크기(10바이트)만큼 str_1로 복사합니다. 복사 후 str_1을 출력하면 기존의 "Tutorials"가 지워지고 "Point"로 덮어써진 것을 확인할 수 있습니다. 참고로 sizeof(str_2)는 문자열의 길이가 아닌 배열 전체 크기를 반환한다는 점을 기억해 두세요. 반면 원본인 str_2는 복사 후에도 그대로 "Point"를 유지합니다.

memcpy() 예제 2: 정수 배열 복사

memcpy()는 문자열뿐 아니라 정수 배열 같은 임의의 메모리 블록도 복사할 수 있습니다.

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

int main() {
    int src[5] = {10, 20, 30, 40, 50};
    int dest[5];

    memcpy(dest, src, sizeof(src));

    for (int i = 0; i < 5; i++) {
        printf("%d ", dest[i]);
    }
    return 0;
}

출력 결과

10 20 30 40 50

마무리

memcpy()는 메모리 블록을 통째로 복사하는 가장 기본적이고 빠른 방법입니다. 다만 널 문자 검사를 하지 않고 메모리 영역이 겹치는 상황에 취약하다는 특성을 이해하고, 복사 크기와 버퍼 크기를 항상 신중하게 관리한다면 안전하게 활용할 수 있습니다. 메모리 영역이 겹칠 가능성이 있는 경우에는 memmove()를 사용하는 것을 권장합니다.