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
/*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