우리가 흔히 C언어로 코딩을 하다 보면 원래 있던 메모리 공간의 값을 다른 공간으로 복사해야 할 때가 있습니다.
이런 문제를 해결해주는 함수가 바로 mempcy입니다. memory + copy의 약자입니다.
이 함수는 내가 복사하려는 대상의 공간을 새로운 공간에 원하는 크기만큼 복사해 줍니다.
즉, 포인터를 알고 memcpy를 알고 있다면 연속된 값들의 집합 변수인 배열, 구조체 등의 메모리를 조금 더 의미 있고 효율적으로 사용할 수 있습니다.
memcpy 함수 원형은?
memcpy 함수는 <string.h> 헤더 파일에 선언되어 있으며, 함수 원형은 아래와 같습니다.
void *memcpy(void *dest, const void *src, size_t n);
memcpy 인자는?
memcpy 함수는 총 세 개의 인자를 받습니다.
각 인자에 대한 쓰임새는 아래와 같습니다.
dest: 복사할 대상 메모리 영역의 시작 주소 포인터
src: 복사할 소스 메모리 영역의 시작 주소 포인터
n: 소스 공간에서 복사할 총 크기를 나타내는 정수
위와 같은 인자들을 전달함으로써 메모리 복사가 이루어집니다.
memcpy 언제 사용하나?
memcpy 함수는 한쪽 메모리에서 다른 쪽 메모리로 내용을 복사할 때 사용합니다.
어떻게 보면 한쪽의 메모리를 다른 쪽으로 이동시킨다고 생각할 수도 있지만, 원본 공간의 값이 변하지 않는다는 점에서 복사가 맞습니다.
특히 memcpy는 배열, 구조체, 포인터 등 변수가 참조 중인 값들을 다른 공간으로 복사할 때 사용합니다.
memcpy 다른 배열의 값을 복사하기 예제
자 그러면 아래의 memcpy 예제를 확인하고 같이 진행해 보겠습니다.
이 예제는 서로 다른 배열의 값을 복사하는 예제입니다.
#include <stdio.h>
#include <string.h>
int main() {
int s[3] = {1, 2, 3};
int d[3];
memcpy(d, s, sizeof(s));
for (int i = 0; i < 3; i++) printf("%d ", d[i]);
return 0;
}
하나씩 살펴보도록 하겠습니다.
우선 s배열은 총 3개의 int 크기를 가지고 있습니다. 즉 바이크 크기로는 3 *(int : 4) = 12입니다.
또한 이 s배열의 모든 값을 그대로 복사하기 위해 d 배열을 선언했으며 크기는 동일합니다.
이제 memcpy를 통해 d에 s공간 첫 번째 주소부터 sizeof(s)만큼 즉, 12 공간의 값을 복사합니다.
이때 d의 첫번째 주소부터 복사를 합니다.
그리고 복사된 결과물을 printf로 출력합니다.
우리가 예상했던 결과처럼 1, 2, 3이 나타납니다.
memcpy 배열의 1 글자씩 다른 배열에 복사하기 예제
다음은 memcpy 함수를 사용하여 배열의 1글자씩 다른 배열에 복사하는 예제입니다.
#include <stdio.h>
#include <string.h>
int main() {
char s[] = "Hello, World!";
char d[sizeof(s)];
memcpy(d, s, sizeof(s));
for (int i = 0; i < sizeof(s); i++) printf("%c ", d[i]);
return 0;
}
위의 예제에서 src 배열의 문자열을 memcpy 함수를 사용하여 dest 배열로 복사합니다.
sizeof(src)를 통해 배열의 크기를 전달하므로, 배열의 모든 문자를 복사할 수 있습니다.
결과적으로 dest 배열은 src 배열의 문자열을 복사하여 출력됩니다.
이처럼 오늘은 메모리 공간 복사 함수인 memcpy의 사용법에 대해 알아보았습니다.
메모리 관리를 효율적으로 하기 위해서는 이러한 API 사용법에 익숙해지는 것이 중요합니다.