memcpy_s 함수

errno_t memcpy_s(void * dest,size_t size, const void * source,   size_t n); 메모리 복사하는 함수

 입력 매개 변수 리스트

dest 복사 대상 버퍼

size 복사 대상 버퍼 크기

source 복사할 원본

n 복사할 바이트 수

반환 값

에러 번호

memcpy 함수는 복상 대상 버퍼 크기보다 복사할 바이트 수가 더 크면 버퍼 오버플로우 버그가 발생합니다. 이를 개선한 함수가 memcpy_s 함수입니다.

사용 예

//C언어 표준 라이브러리 함수 가이드
//errno_t memcpy_s(void * dest,size_t size, const void * source,   size_t n); 메모리 복사하는 함수
//Member 구조체 형식 변수 두 개의 값을 교환하여 출력
#include <string.h>
#include <stdio.h>

#define MAX_NAMELEN    20
typedef struct 
{
    char name[MAX_NAMELEN];
    int age;
}Member;

void Swap(Member *m1, Member *m2)
{
    Member temp;
    memcpy_s(&temp,sizeof(Member),m1,sizeof(Member));//m1의 데이터를  temp 주소로 복사
    memcpy_s(m1,sizeof(Member),m2,sizeof(Member)); //m2의 데이터를 m1으로 복사
    memcpy_s(m2,sizeof(Member),&temp,sizeof(Member));//temp 주소의 데이터를 m2에 복사
}
int main(void)
{
    Member m1={"홍길동",20};
    Member m2={"강감찬",27};

    printf("바꾸기 전\n");
    printf("이름:%s 나이:%d\n",m1.name,m1.age);
    printf("이름:%s 나이:%d\n",m2.name,m2.age);
    Swap(&m1,&m2);//m1 주소와 m2 주소의 데이터를 교환
    printf("바꾸기 후\n");
    printf("이름:%s 나이:%d\n",m1.name,m1.age);
    printf("이름:%s 나이:%d\n",m2.name,m2.age);

    return 0;
}

출력

바꾸기 전
이름:홍길동 나이:20
이름:강감찬 나이:27
바꾸기 후
이름:강감찬 나이:27
이름:홍길동 나이:20

캡슐화 및 해제
그림1. 캡슐화 및 해제
/*https://ehpub.co.kr
  C언어 표준 라이브러리 함수 가이드
  void *memcpy(void * dest, const void * source,   size_t n); 메모리 복사하는 함수
  errno_t memcpy_s(void * dest,size_t size, const void * source,   size_t n); 메모리 복사하는 함수
  실습 내용: 캡슐화 및 캡슐해제                                                                                     */
#include 
#include 

#define MAX_NAMELEN    20

int Encapsulate(char *base,size_t size,size_t offset, void *src,size_t n)
{
    memcpy_s(base + offset, size - offset, src, n);
    return offset + n;
}
int Decapsulate(char* base, size_t offset, void* dest, size_t n)
{
    memcpy_s(dest,n,base+offset,n);
    return offset + n;
}
int main(void)
{
    char name[MAX_NAMELEN]="홍길동";
    int num=10;
    
    
    char buffer[100];
    int offset = 0;
    int len = strlen(name) + 1;
    offset = Encapsulate(buffer, sizeof(buffer), offset, &len, sizeof(len));
    offset = Encapsulate(buffer, sizeof(buffer), offset, name, len);
    offset = Encapsulate(buffer, sizeof(buffer), offset, &num, sizeof(num));
    printf("캡슐 크기:%d bytes\n", offset);

    char name2[MAX_NAMELEN];
    int num2=0;
    int len2 = 0;
    int offset2 = 0;
    offset2 = Decapsulate(buffer, offset2, &len2, sizeof(len2));
    offset2 = Decapsulate(buffer, offset2, name2, len2);
    offset2 = Decapsulate(buffer, offset2, &num2, sizeof(num2));
    printf("이름:%s 번호:%d\n", name2, num2);
    return 0;
}

실행 결과

캡슐 크기:15 bytes
이름:홍길동 번호:10