C포인터와 메모리

동적 메모리와 malloc/free

실행 중 필요한 크기만큼 메모리를 확보하고 반납하는 `malloc`, `free`, `calloc` 기본 패턴을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

c
int *numbers = malloc(sizeof(int) * count);
if (numbers == NULL) {
    return 1;
}

free(numbers);

설명

  • 동적 메모리는 배열 크기를 실행 중에 정해야 할 때 유용합니다.
  • malloc은 필요한 바이트 수만큼 메모리를 확보하고 주소를 돌려줍니다.
  • calloc은 메모리를 0으로 초기화하면서 할당합니다.
  • 사용을 마친 메모리는 free로 반납해야 누수가 쌓이지 않습니다.

짧은 예제

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

int main(void) {
    int count = 4;
    int *numbers = malloc(sizeof(int) * count);

    if (numbers == NULL) {
        return 1;
    }

    for (int i = 0; i < count; i++) {
        numbers[i] = (i + 1) * 10;
    }

    printf("%d %d\n", numbers[0], numbers[3]);
    free(numbers);
    return 0;
}

빠른 정리

항목설명
malloc지정한 바이트 수만큼 메모리 확보
calloc메모리 확보 + 0 초기화
free확보한 메모리 반납
NULL 검사할당 실패 여부 확인
누수free를 빠뜨리면 메모리가 해제되지 않음

주의할 점

이미 해제한 포인터를 다시 free하거나 계속 사용하면 정의되지 않은 동작이 발생합니다. 해제 후 NULL로 돌려 두는 습관이 도움이 됩니다.