사용범위
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) 문자와 상관없이 모든 데이터가 복제된것을 확인할 수 있다.
반응형
'C언어 > string.h' 카테고리의 다른 글
[C언어] strncpy 함수 (문자열 복사) (1) | 2022.10.03 |
---|---|
[C언어] strtok 함수 (문자열 자르기) (2) | 2022.09.20 |
[C언어] memccpy 함수 (특정 문자까지만 메모리 복사) (1) | 2022.09.16 |
[C언어] strcat 함수 (문자열 연결) (0) | 2022.09.15 |
[C언어] strlen 함수 (문자열 길이 확인 함수) (0) | 2022.09.14 |