Core Programming/C Standard Library: Resource & Performan

C언어 메모리 관리 완벽 가이드: memcpy, memmove, memset, memcmp 차이점

임베디드 친구 2025. 2. 18. 09:40
반응형

C언어 메모리 조작 함수 완벽 정리: memcpy, memmove, memset, memcmp

C언어에서 메모리를 직접 다루는 능력은 시스템 성능을 극대화하는 핵심 기술입니다. 하드웨어 제어나 대용량 데이터 처리 시 필수적으로 사용되는 string.h 라이브러리의 대표적인 메모리 조작 함수 4가지를 예제와 함께 완벽히 정리해 보겠습니다.

Generated by Gemini AI.


1. memcpy: 초고속 메모리 복사

memcpy는 성능을 최우선으로 하는 메모리 복사 함수입니다.

함수 원형

C
 
#include <string.h> // 주의: mem 계열 함수는 string.h에 있습니다.
void *memcpy(void *dest, const void *src, size_t n);

특징과 주의사항

  • 성능: 메모리 겹침을 고려하지 않기에 매우 빠릅니다.
  • 위험성: 복사하려는 원본(src)과 대상(dest)의 영역이 겹칠 경우 미정의 동작(Undefined Behavior)이 발생할 수 있습니다. 겹칠 가능성이 있다면 반드시 memmove를 써야 합니다.

예제 코드

C
 
char src[] = "Embedded";
char dest[10];
memcpy(dest, src, sizeof(src)); // NULL 문자 포함 복사

2. memmove: 안전한 영역 이동

memmove는 memcpy와 용도는 같지만, 메모리 영역이 겹치는 상황(Overlap)에서도 안전하게 동작하도록 설계되었습니다.

함수 원형

C
 
void *memmove(void *dest, const void *src, size_t n);

동작 원리

영역이 겹칠 경우 별도의 임시 버퍼를 거치거나 복사 방향을 조절하여 데이터 파손을 막습니다.

예제 코드 (Overlap 상황)

C
 
#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "ABCDEFG";
    // "ABC"를 한 칸 뒤인 "BCD" 위치로 이동 (겹침 발생)
    memmove(str + 1, str, 3); 
    
    printf("결과: %s\n", str); // 결과: AABCEFG
    return 0;
}

3. memset: 효율적인 메모리 초기화

메모리 블록을 특정 값으로 빠르게 채울 때 사용합니다. 주로 구조체나 배열을 0으로 초기화할 때 가장 많이 쓰입니다.

함수 원형

C
 
void *memset(void *s, int c, size_t n);

⚠️ 주의: int 배열 초기화 실수

memset은 바이트(byte) 단위로 값을 채웁니다. 따라서 int 배열을 1로 초기화하려고 memset(arr, 1, sizeof(arr))를 사용하면, 각 바이트가 0x01로 채워져 예상치 못한 큰 값이 들어갑니다. (0 또는 -1 초기화 시에만 안전합니다.)

예제 코드

C
 
struct User {
    int id;
    char name[20];
};

struct User user1;
memset(&user1, 0, sizeof(user1)); // 구조체 전체를 0으로 깔끔하게 초기화

4. memcmp: 정밀한 메모리 비교

두 메모리 블록의 데이터를 바이트 단위로 비교합니다.

함수 원형

C
 
int memcmp(const void *s1, const void *s2, size_t n);

주요 특징

  • strcmp와 달리 NULL 문(\0)을 만나도 중단되지 않고 지정된 n 바이트만큼 끝까지 비교합니다.
  • 구조체 전체를 비교하거나 바이너리 데이터를 비교할 때 유용합니다.

💡 요약 및 선택 가이드

함수 추천 사용 상황 특징
memcpy 겹칠 일이 없는 서로 다른 버퍼 간 복사 최고 속도
memmove 문자열 내에서 구간 이동 등 겹침 우려 시 안전성 우선
memset 배열, 구조체 초기화 (특히 0으로 초기화) 일괄 설정
memcmp 바이너리 데이터나 구조체 동등 비교 바이트 단위 비교

마무리하며

메모리 함수를 정확히 사용하는 것은 버그 없는 견고한 코드를 작성하는 첫걸음입니다. 특히 임베디드 개발 환경에서는 memcpy와 memmove의 차이를 명확히 인지하여 예기치 못한 데이터 오류를 방지하시기 바랍니다.


포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!

임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.

https://coding-by-head.tistory.com/

반응형