C 언어 memcpy 사용법 완벽 가이드

memcpy 함수는 메모리 블록을 한 위치에서 다른 위치로 복사할 때 사용되는 C 표준 라이브러리 함수입니다. 대용량 데이터를 효율적으로 복사할 수 있으며, 시스템 프로그래밍 및 성능 최적화에 자주 활용됩니다.


1. memcpy 함수 기본 문법

#include <string.h>

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

매개변수 설명:

  • dest: 복사한 데이터를 저장할 대상 메모리의 포인터
  • src: 복사할 원본 메모리의 포인터
  • n: 복사할 바이트 수

반환 값:

  • dest 포인터를 반환합니다.

2. 기본 사용 예제

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

int main() {
    char src[] = "Hello, World!";
    char dest[20];

    memcpy(dest, src, strlen(src) + 1); // 널 종료 문자를 포함한 복사
    printf("복사된 문자열: %s\n", dest);

    return 0;
}

출력 결과:

복사된 문자열: Hello, World!

3. 다양한 memcpy 활용 예제

3.1. 배열 복사

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

int main() {
    int src[] = {1, 2, 3, 4, 5};
    int dest[5];

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

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

    return 0;
}

출력 결과:

1 2 3 4 5

3.2. 구조체 복사

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

typedef struct {
    char name[20];
    int age;
} Person;

int main() {
    Person p1 = {"Alice", 30};
    Person p2;

    memcpy(&p2, &p1, sizeof(Person));

    printf("이름: %s, 나이: %d\n", p2.name, p2.age);
    return 0;
}

출력 결과:

이름: Alice, 나이: 30

4. memcpy 사용 시 주의할 점

  1. 중첩 영역(overlapping memory): memcpy는 중첩된 메모리 영역에서 올바르게 작동하지 않습니다. 이런 경우 memmove를 사용하세요.
  2. 정확한 크기 지정: 복사할 크기(n)가 올바른지 확인하세요. 잘못된 크기 지정은 버퍼 오버플로우를 유발할 수 있습니다.
  3. 널 종료 문자 처리: 문자열 복사 시 널 종료 문자를 포함해야 올바른 문자열로 처리됩니다.

5. 실전 예제: 버퍼 복사

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

int main() {
    char buffer1[] = "C Programming";
    char buffer2[50];

    memcpy(buffer2, buffer1, strlen(buffer1) + 1);
    printf("복사된 버퍼: %s\n", buffer2);

    return 0;
}

출력 결과:

복사된 버퍼: C Programming

6. 결론

memcpy 함수는 메모리 복사 작업에서 매우 강력하고 효율적인 도구입니다. 배열, 구조체, 문자열 등 다양한 데이터 유형을 빠르게 복사할 수 있으며, 올바른 사용법과 주의사항을 숙지하면 성능이 중요한 애플리케이션에서 큰 도움이 됩니다.