[C] memcpy, C언어 memcpy, memcpy 함수

728x90
반응형

오늘 알아볼 memcpy 함수는 "메모리를 복사" 하는 함수다.

 

memcpy?

메모리(Memory)를 복사(카피, copy) 하는 함수다. memcpy함수를 사용하기 위해서는 string.h파일이나 memory.h 파일이 include 되어 있어야 한다. 일반적으로 string.h파일을 include 한다. 아래 코드를 보자.

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

int main(void)
{
    int a = 10;
    int b = 0;
    
    printf("a = %d\n", a);
    printf("b = %d\n", b);

    memcpy(&b, &a, sizeof(int));

    printf("a = %d\n", a);
    printf("b = %d\n", b);

    return 1;
}

 

int형 변수 a를 10으로 초기화하고, int형 변수 b를 0으로 초기화시켰다. 첫 번째, 두 번째 printf 결과를 확인해보면 10과 0이 출력되는 것을 확인할 수 있다. 바로 아래 memcpy를 보자. 첫 번째 전달 인자에 b의 주소 값을 전달하고, 두 번째 전달 인자에 a의 주소 값을 전달했다. 마지막 전달 인자로 int형의 사이즈 값을 전달했다. msdn에 memcpy를 검색해보면 아래와 같이 나온다.

wmemcpy는 뒤로하고 memcpy를 살펴보자. memset과 마찬가지로 세 개의 매개변수가 있다.

 

첫 번째 매개변수 void *dest는 데이터를 복사할 새로운 공간의 주소를 가리킨다.

두 번째 매개변수 const void *src는 첫 번째 매개변수에 복사할 값이 있는 주소를 가리킨다.

세 번째 매개변수 size_t count는 복사할 데이터의 크기(길이)다.

 

memcpy를 실행한 다음 printf문을 보면 a와 b의 값이 같아진 걸 확인할 수 있다. 변수 a의 값을 변수 b에 복사했기 때문이다.

 

memcpy로 구조체 복사하기

memcpy는 메모리 영역의 값을 다른 메모리 영역으로 복사하는 기능을 하기 때문에 배열, 구조체에서도 활용할 수 있다. 아래 코드를 보자.

struct People {
    char name[20];
    int age;
    float height;
    float weight;
};

int main(void)
{
    struct People p = { "cong Park blog", 22, 183.8, 77.8 };

    printf("%s\n", p.name);
    printf("%d\n", p.age);
    printf("%.2f\n", p.height);
    printf("%.2f\n", p.weight);

    memcpy(&p.name, "CONG", sizeof(char) * 4);

    printf("%s\n", p.name);
    printf("%d\n", p.age);
    printf("%.2f\n", p.height);
    printf("%.2f\n", p.weight);
   
    return 1;
}

사람의 정보를 표현하는 People 구조체를 만들고 Peopel형 변수 p를 만들고 초기화시켰다. memcpy 이전의 printf 문 출력을 확인해보면 아래와 같을 것이다.

cong Park blog
22
183.80
77.80

 

memcpy 이후의 printf문 출력을 확인해보면,

CONG park blog
22
183.80
77.80

p.name[0] 부터 p.name[3]까지의 값인 "cong"가 대문자 "CONG"로 변경된 것을 확인할 수 있다. 

 

정리하면,

특정 메모리 영역에 원하는 값을 원하는 크기(길이)만큼 복사할 수 있다.

 

- 끝 -

728x90
반응형