살구월드

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

우리가 흔히 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 사용법에 익숙해지는 것이 중요합니다.

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

공유하기

facebook twitter kakaoTalk kakaostory naver band