C언어/string.h

[C언어] memcpy 함수 (메모리 복사)

아무일도없었다 2022. 9. 19. 23:41

사용범위

Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수

기능

C언어 표준 함수로 특정 주소에 저장되어있는 데이터를 복사할때 사용한다.

헤더

#include <string.h>

※ memcpy 함수 사용시 string.h 파일을 include 하지 않는다면 컴파일시 error 발생 ※


함수

void* memcpy(void* dest, const void* source, size_t size);

파라미터

  • void* dest
    • 복제된 데이터를 저장할 버퍼를 입력한다.
  • const void* source
    • dest 에 복제할 데이터 버퍼를 입력한다.
  • size_t size
    • 복제할 데이터의 크기를 byte 단위로 입력한다.

반환값 (return)

복제를 완료한 dest 값을 반환한다.

잡학지식

strncpy 와 memcpy 의 차이점은 NULL 문자를 만났을때 나타난다.

 

보통 string 의 경우 NULL 문자로 종료를 나타내기 때문에 strncpy 함수에서는 NULL 문자를 만나면 size 에 도달하지 않아도 복사를 중단한다.

 

하지만 memcpy 의 경우 string 뿐만 아니라 byte 단위로 모든 데이터를 복제하고, NULL 문자를 만나도 size 에 도달할때까지 복사를 중단하지 않는다.

 

따라서 NULL 문자로 종료되는 string 데이터가 확실한 경우 strncpy 를 쓰는게 안전하고 NULL 문자를 포함한 byte array 데이터의 경우 memcpy 를 사용하는것이 일반적이다.


 

<소스 코드>

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

int main() {
    unsigned char dest[MAX_BUF_SIZE] = {0,};
    unsigned char byte_arr[MAX_BUF_SIZE] = {0,};
    int i;

    for(i=0; i<COPY_SIZE; i++) {
        if ((i % 2) == 0) {
            byte_arr[i] = '\0'; // NULL
        } else {
            byte_arr[i] = (char)(i + 1);
        }
    }

    printf("byte_arr = [ ");
    for(i=0; i<COPY_SIZE; i++) {
        printf("%02X ", byte_arr[i]);
    }
    printf("]\n");

    // strncpy (string copy)
    strncpy(dest, byte_arr, COPY_SIZE);

    printf("(strncpy)dest = [ ");
    for(i=0; i<COPY_SIZE; i++) {
        printf("%02X ", dest[i]);
    }
    printf("]\n");

    // memcpy (memory copy)
    memcpy(dest, byte_arr, COPY_SIZE);

    printf("(memcpy)dest = [ ");
    for(i=0; i<COPY_SIZE; i++) {
        printf("%02X ", dest[i]);
    }
    printf("]\n");

    return 0;
}

 

※ 실행 결과

byte_arr = [ 00 02 00 04 00 06 00 08 00 0A ]
(strncpy)dest = [ 00 00 00 00 00 00 00 00 00 00 ]
(memcpy)dest = [ 00 02 00 04 00 06 00 08 00 0A ]

 

※ strncpy 에서는 NULL(0x00) 문자로 인해 data 복제가 중단되었고, memcpy 에서는 NULL(0x00) 문자와 상관없이 모든 데이터가 복제된것을 확인할 수 있다.

반응형