기본 패턴
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은 항상 임시 변수 패턴으로 받는 편이 안전합니다.