memcpy() 함수는 메모리 블록을 한 위치에서 다른 위치로 복사할 때 사용하는 표준 라이브러리 함수입니다. 복사 대상은 두 곳으로 나뉘는데, 하나는 소스(source), 다른 하나는 대상(destination)이며 각각 포인터로 지정합니다. 이 함수는 C 언어의 string.h 헤더 파일에 선언되어 있습니다.
특히 memcpy()는 복사 과정에서 오버플로우(overflow) 검사를 수행하지 않는다는 점에 유의해야 합니다. 따라서 개발자가 직접 대상 버퍼의 크기가 충분한지 확인해야 안전하게 사용할 수 있습니다.
memcpy() 함수의 문법
void *memcpy(void *dest_str, const void *src_str, size_t number);
각 매개변수의 의미는 다음과 같습니다.
- dest_str − 복사된 데이터가 저장될 대상 배열을 가리키는 포인터입니다.
- src_str − 복사할 원본 데이터가 있는 소스 배열을 가리키는 포인터입니다. const로 선언되어 있어 함수 내부에서 원본이 변경되지 않음을 보장합니다.
- number − 소스에서 대상으로 복사할 바이트 수를 지정합니다.
함수는 작업이 성공하면 대상 포인터(dest_str)를 반환하며, 두 메모리 영역이 겹치는 경우(overlapping)에는 동작이 정의되어 있지 않으므로 이런 상황에서는 memmove()를 사용하는 것이 좋습니다.
memcpy() 사용 예제
#include <stdio.h>
#include <string.h>
int main () {
char a[] = "Firststring";
const char b[] = "Secondstring";
memcpy(a, b, 5);
printf("New arrays : %s\t%s", a, b);
return 0;
}실행 결과
New arrays : Seconstring Secondstring
예제 코드 분석
위 프로그램에서는 char형 배열 두 개를 초기화한 후, memcpy() 함수를 호출하여 소스 문자열 b의 앞 5바이트를 대상 문자열 a로 복사하고 있습니다.
char a[] = "Firststring"; const char b[] = "Secondstring"; memcpy(a, b, 5);
복사가 실행되면 배열 a의 첫 5글자("First")가 b의 첫 5글자("Secon")로 교체되므로, 최종적으로 a는 "Seconstring"이 됩니다. 반면 원본 배열 b는 const로 보호되고 있기 때문에 그대로 유지됩니다.
이처럼 memcpy()는 문자열뿐 아니라 구조체, 배열 등 임의의 메모리 블록을 빠르게 복사해야 할 때 널리 활용되는 강력한 함수입니다.