Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 realloc()로 메모리 크기 재할당하기

C 언어의 realloc() 함수는 이전에 malloc() 또는 calloc()으로 할당했던 메모리 블록의 크기를 변경(재할당)할 때 사용합니다. 프로그램 실행 중에 필요한 메모리 크기가 달라질 때 유용하게 활용되며, 기존에 저장된 데이터는 가능한 한 그대로 유지됩니다.

realloc() 함수의 문법

void *realloc(void *pointer, size_t size);

매개변수

  • pointer – malloc() 또는 calloc()으로 이전에 할당된 메모리 블록을 가리키는 포인터입니다.
  • size – 새롭게 지정할 메모리 블록의 크기(바이트 단위)입니다.

반환값과 주의 사항

  • 성공 시 재할당된 메모리의 시작 주소를 반환하며, 기존 데이터는 그대로 보존됩니다.
  • 실패 시 NULL을 반환하며, 이때 원래 메모리 블록은 그대로 남아 있으므로 반드시 반환값을 확인해야 합니다.
  • 새 크기는 바이트 단위이므로 요소 개수에 자료형 크기(sizeof)를 곱해서 전달해야 합니다.
  • 사용이 끝난 메모리는 free()로 해제해야 메모리 누수를 방지할 수 있습니다.

예제

다음은 calloc()으로 정수 4개를 저장할 메모리를 할당한 뒤, realloc()으로 6개 크기로 확장하는 예제입니다.

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

int main() {
    int n = 4, i, *p, s = 0;

    /* 정수 4개 크기만큼 메모리 할당 */
    p = (int*) calloc(n, sizeof(int));
    if (p == NULL) {
        printf("\nError! memory not allocated.");
        exit(1);
    }

    printf("\nEnter elements of array : ");
    for (i = 0; i < n; ++i) {
        scanf("%d", p + i);
        s += *(p + i);
    }
    printf("\nSum : %d", s);

    /* 메모리를 정수 6개 크기로 확장 */
    p = (int*) realloc(p, 6 * sizeof(int));
    if (p == NULL) {
        printf("\nError! memory not reallocated.");
        exit(1);
    }

    printf("\nEnter additional elements of array : ");
    for (i = n; i < 6; ++i) {
        scanf("%d", p + i);
        s += *(p + i);
    }
    printf("\nNew Sum : %d", s);

    free(p);
    return 0;
}

실행 결과

Enter elements of array : 3 34 28 8
Sum : 73
Enter additional elements of array : 10 15
New Sum : 98

코드 설명

위 프로그램은 먼저 calloc()을 사용해 정수 4개를 저장할 메모리 블록을 할당하고, 입력받은 요소들의 합을 계산합니다. 이후 realloc()이 메모리 블록의 크기를 4개에서 6개로 확장하며, 이미 저장된 값들은 그대로 유지됩니다. 확장된 공간에는 새로운 요소 2개를 추가로 입력받아 합계를 갱신하고, 마지막에 free()로 메모리를 해제합니다.

p = (int*) realloc(p, 6 * sizeof(int));
if (p == NULL) {
    printf("\nError! memory not reallocated.");
    exit(1);
}

핵심 부분은 위 코드입니다. realloc()에 전달하는 크기는 바이트 단위이므로 요소 개수에 sizeof(int)를 곱해야 하며, 반환값이 NULL인지 검사해 재할당 실패 상황에 대비하는 것이 안전한 프로그래밍 습관입니다. 더욱 견고한 코드를 원한다면 반환값을 임시 포인터에 받아 검사한 후 원래 포인터에 대입하는 방식을 권장합니다.