C언어 realloc() 활용법: 문법, 모범 사례, 실전 예제
realloc()이란?
realloc()은 기존 메모리 블록의 크기를 조정하는 C 표준 라이브러리 함수입니다. 블록을 확장하거나 축소하면서 기존 내용을 보존합니다. 런타임에 필요한 크기가 변경될 때 동적 메모리 관리를 더 효율적으로 만듭니다.
문법
ptr = realloc(ptr, newSize);
여기서 ptr은 이전에 할당된 블록을 가리키고, newSize는 원하는 새 크기(바이트)입니다. 호출 후 ptr은 새 블록의 첫 바이트를 가리킵니다. 재할당 성공 시 원본 데이터가 새 위치로 복사되고, 필요시 기존 블록이 해제됩니다.
기억해야 할 핵심 사항
realloc() 성공 시 반환된 포인터는 원래 포인터와 같을 수도, 새 주소일 수도 있습니다.
- 실패 시
NULL을 반환하고 원본 블록은 그대로 유지됩니다.
- 실패 시 원래 주소를 잃지 않도록 결과를 임시 포인터에 할당해야 합니다.
- 성공적 재할당 후 포인터는 한 번만 해제하세요.
예제 – 문자열 버퍼 크기 조정
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char *buf = malloc(10);
if (!buf) {
perror("malloc");
return EXIT_FAILURE;
}
strcpy(buf, "Programming");
printf("%s\n", buf);
char *tmp = realloc(buf, 20); // 버퍼 크기 증가
if (!tmp) {
free(buf); // 원본 블록 여전히 유효
perror("realloc");
return EXIT_FAILURE;
}
buf = tmp;
strcat(buf, " in C");
printf("%s\n", buf);
free(buf);
return EXIT_SUCCESS;
}
예제 – 정수 배열 할당 및 크기 조정
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(10 * sizeof(int));
if (!arr) {
perror("malloc");
return EXIT_FAILURE;
}
/* ... 배열 사용 ... */
int *tmp = realloc(arr, 50 * sizeof(int));
if (!tmp) {
free(arr);
perror("realloc");
return EXIT_FAILURE;
}
arr = tmp;
printf("배열 크기 조정 성공\n");
free(arr);
return EXIT_SUCCESS;
}
실전 팁
- 부호 관련 버그 방지를 위해 크기 인자에는
size_t 사용을 권장.
- 블록 축소 시 새 크기 이후의 데이터는 버려짐을 인지하세요.
- 포인터 사용 전 반환값을 항상 확인하세요.
- 성공한 할당마다
free()를 정확히 한 번씩 호출하세요.