C포인터와 메모리

memcpy, memmove, memset

raw memory를 직접 복사하고 이동하고 초기화하는 `memcpy`, `memmove`, `memset`의 역할과 차이를 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

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바이트 수 계산에 자주 사용포인터에 쓰면 길이가 아님

주의할 점

memcpymemmove는 둘 다 "길이를 바이트 단위로 직접 넘긴다"는 점이 중요합니다. 원소 개수와 바이트 수를 혼동하면 일부만 복사되거나 경계를 넘는 쓰기가 생길 수 있습니다.

참고 링크

3 sources