본문 바로가기
프로그래밍 언어/C 언어

[C/C++] memcpy 사용 방법

by 까망 하르방 2021. 11. 24.
반응형

함수 원형

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

dest: 데이터가 복사되는 영역 (To)

src: 복사할 원본 데이터 (From)

N : 복사할 크기 (Byte)

→ memcpy(복사 받는 메모리, 복사할 메모리, 크기);

    src 메모리 영역에서 dest 메모리 영역으로 N byte 만큼 복사

* 필요한 헤더파일: <string.h> 혹은 <memory.h>

 

반환 값

dest 포인터 (void* 형)

 

예제 (2차원 배열 복사)

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

int src[][3] = { {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}};
int dest[3][3];

int main()
{
    // 복사 전
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            printf("%d ", dest[i][j]);
        }
        printf("\n");
    }

    memcpy(dest, src, sizeof(src));
    printf("\n");

    // 복사 후
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            printf("%d ", dest[i][j]);
        }
        printf("\n");
    }  
}

 

예제 (문자열 memcpy)

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

int main()
{
    char src[5] = "1234";
    char dest1[9] = "00005678";
    char dest2[9] = "00005678";
    char dest3[9] = "00005678";

    printf("memcpy 수행 전\n");
    printf("dest1 = %s\n", dest1);
    printf("dest2 = %s\n", dest2);
    printf("dest3 = %s\n", dest3);

    // 1) 의도하지 않은 결과가 나올 수 있음
    memcpy(dest1, src, sizeof(char) * 4);

    // 2) 문자열의 경우, 복사할 문자열 길이 + 1
    memcpy(dest2, src, sizeof(char) * 4 + 1);

    // 3) sizeof 를 활용하면 보다 쉽게 처리 가능
    memcpy(dest3, src, sizeof(src)); // 5 Byte

    puts("");
    printf("memcpy 수행 후\n");
    printf("dest1 = %s\n", dest1);
    printf("dest2 = %s\n", dest2);
    printf("dest3 = %s\n", dest3);
}

 

memcpy 주의 사항

① 문자열 memcpy 할 때는 문자열의 끝의 「\0」 까지 고려해야 한다.

    dest1 변수(="00005678\0")에서 앞의 4 자리만 교체해주면 "12345678\0" 이 된다.

    dest2 변수(="00005678")에는 5자리 복사되어 (1234\0678\0)이 된다.

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

int main()
{
    char src[5] = "1234";
    char dest2[9] = "00005678";
    
    printf("memcpy 수행 전\n");
    printf("dest2 = %s\n", dest2);
    
    memcpy(dest2, src, sizeof(char) * 4 + 1);

    puts("");
    printf("memcpy 수행 후\n");
    printf("dest2 = %s\n", dest2);
    
    puts("\n");
    for (int i = 0; i < 9; ++i)
    {
        printf("%c ", dest2[i]);
    }
    puts("");
}

"1234\0678\0"가 출력되는 것을 확인할 수 있다.

경우에 따라서는 해당 위치에 직접적으로 \0 넣어도 된다.

 

dest와 src가 가리키는 메모리 크기는 N 바이트 이상이어야

오버플로우가 발생하지 않는다.

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

int main()
{
    char dest[2];
    char src[5]  = "Data";
    
    // Error (크기 오류)
    memcpy(dest, src, sizeof(char) * 3);

}

 

 dest와 src 메모리 영역이 서로 겹치면 원치 않은 결과가 나올 수 있다.

이 경우 memmove() 함수를 사용해야 합니다.

 

[C/C++] memmove() 함수 사용과 예제

함수 원형 void* memcpy (void* dest, const void* src, size_t num) • dest: 데이터가 복사될 곳 (void* 형) • src: 복사될 데이터가 위치하는 곳 (void* 형) • num: 복사할 크기 (byte 단위) → src 에 있..

zoosso.tistory.com


📌 함께 보면 좋은 포스팅

• memset() 함수

• memmove() 함수 사용과 예제

반응형

댓글