C포인터와 메모리

calloc과 realloc

동적 메모리를 0으로 초기화해 할당하는 `calloc`과 크기를 조정하는 `realloc`의 핵심 규칙을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

c
int *values = calloc(count, sizeof *values);
int *temp = realloc(values, new_count * sizeof *values);
if (temp != NULL) {
    values = temp;
}

설명

  • calloc은 여러 원소를 한 번에 할당하면서 메모리를 0으로 초기화합니다.
  • realloc은 기존 메모리 블록 크기를 늘리거나 줄일 때 사용하며, 필요하면 다른 위치로 옮길 수도 있습니다.
  • realloc이 성공하면 새 포인터를 돌려줄 수 있으므로, 기존 포인터를 바로 덮어쓰지 않고 임시 변수에 받는 패턴이 중요합니다.
  • 동적 배열 구현이나 입력 크기를 미리 모를 때 realloc이 특히 자주 등장합니다.

짧은 예제

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

int main(void) {
    size_t count = 3;
    int *values = calloc(count, sizeof *values);
    int *temp = realloc(values, 5 * sizeof *values);
    if (temp == NULL) {
        free(values);
        return 1;
    }

    values = temp;
    values[3] = 40;
    values[4] = 50;
    printf("%d %d\n", values[3], values[4]);
    free(values);
    return 0;
}

빠른 정리

항목설명
calloc(n, size)n개 원소를 0으로 초기화해 할당
realloc(ptr, size)기존 블록 크기를 조정
임시 포인터realloc 결과는 먼저 임시 변수에 받는 편이 안전
메모리 이동 가능성realloc 후 기존 포인터 주소가 유지된다고 가정하면 안 됨
실패 처리실패 시 원래 포인터는 여전히 유효할 수 있음

주의할 점

values = realloc(values, new_size);처럼 바로 대입하면 실패했을 때 기존 포인터를 잃어 메모리를 해제하지 못할 수 있습니다. realloc은 항상 임시 변수 패턴으로 받는 편이 안전합니다.