c 언어/c 표준 라이브러리(Standard C Library)

C 언어 `stdlib.h`의 메모리 조작 함수 완벽 정리

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

C 언어에서 메모리를 직접 다루는 것은 성능과 효율성을 고려할 때 매우 중요한 요소입니다. stdlib.h 헤더 파일에는 메모리를 조작하는 다양한 함수들이 포함되어 있으며, 그중에서도 memcpy, memmove, memset, memcmp는 가장 많이 사용됩니다. 이번 포스트에서는 이들 함수의 동작 방식과 사용법을 예제 코드와 함께 살펴보겠습니다.


1. memcpy 함수

개요

memcpy 함수는 한 메모리 블록에서 다른 메모리 블록으로 데이터를 복사할 때 사용됩니다. 하지만, 두 메모리 블록이 겹치는 경우 예측할 수 없는 동작(UB, Undefined Behavior)이 발생할 수 있습니다.

함수 원형

void *memcpy(void *dest, const void *src, size_t n);

매개변수 설명

  • dest: 데이터를 복사할 대상 메모리 주소
  • src: 원본 데이터가 저장된 메모리 주소
  • n: 복사할 바이트 수

사용 예제

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

int main() {
    char src[] = "Hello, World!";
    char dest[20];

    memcpy(dest, src, strlen(src) + 1);

    printf("복사된 문자열: %s\n", dest);
    return 0;
}

주의 사항

  • memcpy는 겹치는 메모리 영역을 처리하지 않으므로 겹치는 경우에는 memmove를 사용해야 합니다.
  • 성능이 빠르지만 안전한 복사가 필요한 경우에는 주의가 필요합니다.

2. memmove 함수

개요

memmove 함수는 memcpy와 유사하지만, 겹치는 메모리 영역에서도 안전하게 복사가 가능합니다.

함수 원형

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

사용 예제

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

int main() {
    char str[] = "Hello, World!";

    printf("이전 문자열: %s\n", str);
    memmove(str + 6, str, 5); // 'Hello'를 'World' 위치로 이동
    printf("이동 후 문자열: %s\n", str);

    return 0;
}

차이점 (memcpy vs memmove)

함수 겹치는 메모리 복사 안전성 속도
memcpy X (안전하지 않음) 빠름
memmove O (안전함) 상대적으로 느림

3. memset 함수

개요

memset 함수는 메모리 블록을 특정 값으로 채울 때 사용됩니다.

함수 원형

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

사용 예제

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

int main() {
    char buffer[10];
    memset(buffer, '*', sizeof(buffer));

    printf("메모리 채운 값: %.*s\n", (int)sizeof(buffer), buffer);
    return 0;
}

주요 용도

  • 배열 초기화 (0 또는 특정 값)
  • 버퍼 클리어
  • 구조체 초기화

4. memcmp 함수

개요

memcmp 함수는 두 메모리 블록의 내용을 비교할 때 사용됩니다.

함수 원형

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

반환값

  • 0: 두 메모리 블록이 같음
  • < 0: s1s2보다 작음
  • > 0: s1s2보다 큼

사용 예제

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

int main() {
    char a[] = "ABC";
    char b[] = "ABD";

    int result = memcmp(a, b, 3);

    if (result == 0) {
        printf("메모리 블록이 같습니다.\n");
    } else if (result < 0) {
        printf("첫 번째 블록이 작습니다.\n");
    } else {
        printf("첫 번째 블록이 큽니다.\n");
    }
    return 0;
}

마무리

이 포스트에서는 stdlib.h의 대표적인 메모리 조작 함수인 memcpy, memmove, memset, memcmp에 대해 살펴보았습니다. 각 함수의 특징과 예제를 숙지하면 메모리를 다룰 때 더욱 안전하고 효율적으로 사용할 수 있습니다.

요약

  • memcpy: 메모리를 빠르게 복사하지만, 겹치는 경우 안전하지 않음
  • memmove: 겹치는 메모리 복사도 안전하게 수행 가능
  • memset: 특정 값으로 메모리를 채움
  • memcmp: 두 메모리 블록을 비교

이제 C 프로그래밍에서 메모리 조작을 더욱 효과적으로 활용해 보세요!

반응형