반응형
함수 원형
void *memcpy(void *dest, const void *src, size_t N);
•dest: 데이터가 복사되는 영역 (To)
•src: 복사할 원본 데이터 (From)
•N : 복사할 크기 (Byte)
→ memcpy(복사 받는 메모리, 복사할 메모리, 크기);
src 메모리 영역에서 dest 메모리 영역으로 N byte 만큼 복사
* 필요한 헤더파일: <string.h> 혹은 <memory.h>
반환 값
dest 포인터 (void* 형)
예제 (2차원 배열 복사)
#include <stdio.h>
#include <string.h>
int src[][3] = { {1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
int dest[3][3];
int main()
{
// 복사 전
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
printf("%d ", dest[i][j]);
}
printf("\n");
}
memcpy(dest, src, sizeof(src));
printf("\n");
// 복사 후
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
printf("%d ", dest[i][j]);
}
printf("\n");
}
}
예제 (문자열 memcpy)
#include <stdio.h>
#include <string.h>
int main()
{
char src[5] = "1234";
char dest1[9] = "00005678";
char dest2[9] = "00005678";
char dest3[9] = "00005678";
printf("memcpy 수행 전\n");
printf("dest1 = %s\n", dest1);
printf("dest2 = %s\n", dest2);
printf("dest3 = %s\n", dest3);
// 1) 의도하지 않은 결과가 나올 수 있음
memcpy(dest1, src, sizeof(char) * 4);
// 2) 문자열의 경우, 복사할 문자열 길이 + 1
memcpy(dest2, src, sizeof(char) * 4 + 1);
// 3) sizeof 를 활용하면 보다 쉽게 처리 가능
memcpy(dest3, src, sizeof(src)); // 5 Byte
puts("");
printf("memcpy 수행 후\n");
printf("dest1 = %s\n", dest1);
printf("dest2 = %s\n", dest2);
printf("dest3 = %s\n", dest3);
}
memcpy 주의 사항
① 문자열 memcpy 할 때는 문자열의 끝의 「\0」 까지 고려해야 한다.
dest1 변수(="00005678\0")에서 앞의 4 자리만 교체해주면 "12345678\0" 이 된다.
dest2 변수(="00005678")에는 5자리 복사되어 (1234\0678\0)이 된다.
#include <stdio.h>
#include <string.h>
int main()
{
char src[5] = "1234";
char dest2[9] = "00005678";
printf("memcpy 수행 전\n");
printf("dest2 = %s\n", dest2);
memcpy(dest2, src, sizeof(char) * 4 + 1);
puts("");
printf("memcpy 수행 후\n");
printf("dest2 = %s\n", dest2);
puts("\n");
for (int i = 0; i < 9; ++i)
{
printf("%c ", dest2[i]);
}
puts("");
}
"1234\0678\0"가 출력되는 것을 확인할 수 있다.
경우에 따라서는 해당 위치에 직접적으로 \0 넣어도 된다.
② dest와 src가 가리키는 메모리 크기는 N 바이트 이상이어야
오버플로우가 발생하지 않는다.
#include <stdio.h>
#include <string.h>
int main()
{
char dest[2];
char src[5] = "Data";
// Error (크기 오류)
memcpy(dest, src, sizeof(char) * 3);
}
③ dest와 src 메모리 영역이 서로 겹치면 원치 않은 결과가 나올 수 있다.
이 경우 memmove() 함수를 사용해야 합니다.
📌 함께 보면 좋은 포스팅
반응형
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[C 전처리기] #error 활용 예제 (0) | 2022.08.11 |
---|---|
[C/C++] memmove() 함수 사용과 예제 (0) | 2021.11.28 |
[C/C++] do-while 문 형태와 활용 (0) | 2021.11.22 |
[C] printf 서식 (0) | 2021.09.14 |
[C/C++] memset 사용시 주의사항 (0) | 2021.09.11 |
댓글