| 프로그래밍 분야/C

💡 [C언어] memcpy 함수 설명 및 다양한 예시

Meoru_ 2021. 5. 4. 14:31

💡 man memcpy

NAME
     memcpy -- copy memory area

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <string.h>

     void *
     memcpy(void *restrict dst, const void *restrict src, size_t n);

DESCRIPTION
     The memcpy() function copies n bytes from memory area src to memory area dst.  If dst
     and src overlap, behavior is undefined.  Applications in which dst and src might overlap
     should use memmove(3) instead.

RETURN VALUES
     The memcpy() function returns the original value of dst.

SEE ALSO
     bcopy(3), memccpy(3), memmove(3), strcpy(3), wmemcpy(3)

STANDARDS
     The memcpy() function conforms to ISO/IEC 9899:1990 (``ISO C90'').

memcpy() 함수는 string.h 에 정의되어 있으며, 소스 주소의 값을 정해준 크기만큼 참조하여 목적 주소에 복사(copy)하는 함수이다.

 

void *memcpy(void *restrict dst, const void *restrict src, size_t n);

dst : 목적 주소

src : 소스 주소

n : 복사할 데이터 크기(바이트 단위)

리턴값은 dst의 주솟값이다.

 

size_t 에 관한 포스팅)

 

[C/C++] size_t 자료형의 정의

size_t 아래는 C99의 원문이다. size_t can store the maximum size of a theoretically possible object of any type. 즉, 32비트 환경에서는 32비트, 64비트 환경에서는 64비트의 unsigned 변수로써 다음과 같..

meoru-tech.tistory.com

 

💡 테스트케이스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<<TEST ~ memcpy>>
 
---------- memcpy(str, str1, 8)
Original    :    [str]  Hello World!
           [str1] Hello !!!!!!
Result      :   [str]  Hello !!rld!
 
---------- memcpy(str, str1, 4)
Original    :    [str]  Hello World!
           [str1] Wow
Result      :    [str]  Wow
 
---------- memcpy(list, list1, sizeof(list1))
Original    :    [list]  {0, 1, 2, 3, 4, 5, 6, 7}
           [list1] {0, 1, 2, 42, 4, 5, 6, 24}
Result      :    {0, 1, 2, 42, 4, 5, 6, 24}
 
---------- memcpy(list, list1, sizeof(int) * 4)
Original    :    [list]  {0, 1, 2, 3, 4, 5, 6, 7}
           [list1] {0, 1, 2, 42, 4, 5, 6, 24}
Result      :    {0, 1, 2, 42, 4, 5, 6, 7}
 
---------- memcpy(list, list1, sizeof(int) * 4 - 3)
Original    :    [list]  {0, 1, 2, 3, 4, 5, 6, 7}
           [list1] {0, 1, 2, 1042, 4, 5, 6, 24}
Result      :    {0, 1, 2, 18, 4, 5, 6, 7}





cs

 

💡 예외 상황

복사받는 주소의 범위와 소스 주소의 범위가 겹치면 안된다. 그런 경우 memmove() 를 이용해줘야한다. 요즘은 실행은 잘 된다고 하던데...