기본 패턴
c
int src[3] = {1, 2, 3};
int dst[3];
memcpy(dst, src, sizeof(src));
memset(dst, 0, sizeof(dst));설명
memcpy,memmove,memset은 문자열이 아니라 "바이트 단위 메모리"를 직접 다루는 함수입니다. 그래서 빠르고 강력하지만, 타입 의미를 거의 보호해 주지 않습니다.memcpy는 두 메모리 구간이 겹치지 않는다고 가정하고 복사합니다. 가장 흔하고 빠른 복사 함수지만, source와 destination이 겹치면 결과가 정의되지 않을 수 있습니다.memmove는 메모리 구간이 겹칠 수 있는 경우까지 고려합니다. 같은 버퍼 안에서 앞당기거나 뒤로 미는 작업처럼 overlap 가능성이 있으면memmove가 더 안전합니다.memset은 메모리를 특정 바이트 값으로 채웁니다.0으로 초기화하는 용도로 많이 쓰지만, 모든 타입을 임의 값으로 초기화하는 일반 해법은 아닙니다.- 핵심은 "이 함수들은 타입이 아니라 바이트를 다룬다"는 점입니다. 구조체, 배열, 버퍼를 빠르게 처리할 수 있지만, 크기 계산과 겹침 여부를 사람이 직접 책임져야 합니다.
빠른 정리
| 함수 | 역할 | 주의점 |
|---|---|---|
memcpy | 겹치지 않는 메모리 복사 | overlap이면 위험 |
memmove | 겹칠 수도 있는 메모리 이동 | memcpy보다 의도상 더 안전 |
memset | 바이트 값으로 채우기 | 타입 의미까지 보장하지 않음 |
sizeof | 바이트 수 계산에 자주 사용 | 포인터에 쓰면 길이가 아님 |
주의할 점
memcpy와 memmove는 둘 다 "길이를 바이트 단위로 직접 넘긴다"는 점이 중요합니다. 원소 개수와 바이트 수를 혼동하면
일부만 복사되거나 경계를 넘는 쓰기가 생길 수 있습니다.
참고 링크
3 sources