동적할당

기술노트

[C] 동적 메모리 할당 (Dynamic Memory Allocation)

동적 할당이란?

프로그램 실행 중에 동적으로 메모리를 할당하는 것을 의미하며, 힙(Heap) 영역에 메모리를 확보한다. 정적 메모리 할당(static allocation)과 달리, 실행 중 필요한 만큼 메모리를 확보할 수 있어 유연한 메모리 관리가 가능하다.

특징

  • 동적 메모리 할당에는 #include <stdlib.h> 헤더 파일이 필요하다.
  • 할당된 메모리는 free() 함수를 사용하여 명시적으로 해제해야 한다.
  • 메모리를 해제하지 않으면 메모리 누수(memory leak)가 발생할 수 있다.

주요 동적 메모리 관련 함수

  • malloc - 원하는 크기만큼 메모리를 할당
 * void* malloc(size_t size)
 * 예: malloc(sizeof(int) * 4) → int형 4개만큼 메모리 할당
  • calloc - 메모리 할당과 동시에 0으로 초기화
 * void* calloc(size_t nelem, size_t elsize)
 * 첫 번째 인자: 요소 개수, 두 번째 인자: 요소 크기
  • realloc - 기존 메모리 블록의 크기를 변경 (확장 또는 축소)
 * void* realloc(void* ptr, size_t size)
 * 원래 데이터는 유지됨
  • free - 동적으로 할당된 메모리를 해제
 * void free(void* ptr)

예제 코드

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int arr[4] = { 4, 3, 2, 1 };
    int* pArr;

    // 동적할당: int형 4개만큼 메모리 할당
    pArr = (int*)malloc(sizeof(int) * 4);

    if (pArr == NULL) {
        printf("malloc error\n");
        exit(1);
    }

    // 배열 복사
    for (int i = 0; i < 4; ++i) {
        pArr[i] = arr[i];
    }

    // 출력
    for (int i = 0; i < 4; ++i) {
        printf("%d\n", pArr[i]);
    }

    // 메모리 해제
    free(pArr);

    return 0;
}

코드 설명

  • (int*): malloc은 반환형이 void*이므로 int*로 형 변환
  • sizeof(int): int형의 바이트 크기 (일반적으로 4바이트)
  • malloc(sizeof(int) * 4): int형 변수 4개 분량의 메모리 확보
  • free(pArr): 사용이 끝난 후 반드시 메모리 해제

정리

동적 메모리 할당은 메모리를 유동적으로 사용하는 데 매우 유용하지만, 해제를 잊으면 시스템 성능 저하나 오류를 유발할 수 있다. 따라서 메모리를 적절히 할당하고, 사용 후 반드시 free()로 해제하는 습관이 중요하다.