동적 메모리 할당 크기 변경: C 언어의 realloc 함수 활용 예제

  • 6 minutes to read

본 아티클에서는 C 언어에서 동적 메모리 할당 크기를 변경하는 방법에 대해 설명합니다. 이를 위해 realloc 함수를 사용하는 예제 코드인 'realloc_memory.c'를 준비했습니다.

C 언어에서 메모리를 동적으로 할당하거나 해제하는 것은 상당히 중요한 작업입니다. malloc 함수를 사용하여 메모리를 동적으로 할당할 수 있으며, free 함수를 사용하여 메모리를 해제할 수 있습니다. 그러나 때로는 이미 할당된 메모리의 크기를 변경해야 하는 경우가 있습니다. 이런 경우에는 realloc 함수를 사용합니다.

아래는 realloc 함수를 사용하여 동적 메모리 할당 크기를 변경하는 예제입니다.

코드: realloc_memory.c

#define _CRT_SECURE_NO_WARNINGS  // Visual Studio에서 경고 메시지를 무시하도록 하는 매크로
#include <stdio.h>  // 표준 입출력 함수를 사용하기 위해 stdio.h 헤더 파일을 포함
#include <stdlib.h>  // malloc, realloc 등의 메모리 관리 함수를 사용하기 위해 stdlib.h 헤더 파일을 포함

int main(void)
{
    int* arr = (int*)malloc(5 * sizeof(int));  // 정수형 포인터 arr를 선언하고, 동적 메모리 할당을 통해 int형 변수 5개 크기만큼의 메모리를 할당
    if (arr == NULL)  // 메모리 할당이 실패한 경우
    {
        printf("메모리 할당 실패\n");  // 에러 메시지 출력
        return 1;  // 프로그램 종료
    }

    for (int i = 0; i < 5; i++)  // arr 배열에 0부터 8까지의 2의 배수를 저장
    {
        arr[i] = i * 2;
    }

    int* newArr = (int*)realloc(arr, 10 * sizeof(int));  // arr의 크기를 10개의 int 크기로 늘리는 realloc 함수 사용
    if (newArr == NULL)  // 메모리 재할당이 실패한 경우
    {
        printf("메모리 재할당 실패\n");  // 에러 메시지 출력
        free(arr);  // 원래 할당한 메모리 해제
        return 1;  // 프로그램 종료
    }

    arr = newArr;  // arr 포인터에 재할당된 메모리의 주소 할당

    for (int i = 5; i < 10; i++)  // 새롭게 할당된 arr 배열의 나머지 부분에 10부터 18까지의 2의 배수를 저장
    {
        arr[i] = i * 2;
    }

    for (int i = 0; i < 10; i++)  // arr 배열에 저장된 모든 원소 출력
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr);  // 동적으로 할당했던 메모리 해제

    return 0;  // 프로그램 정상 종료
}

이 코드는 처음에 5개의 int 타입 원소를 저장할 수 있는 메모리를 동적으로 할당합니다. 그 다음 각 원소에 2의 배수를 저장하고, realloc 함수를 사용하여 메모리 크기를 10개의 int 타입 원소를 저장할 수 있도록 확장합니다. 메모리 재할당이 성공하면, 새롭게 확장된 부분에도 2의 배수를 저장합니다. 그 후, 모든 원소를 출력하고, 동적으로 할당했던 메모리를 해제합니다.

이 코드를 실행하면 다음과 같은 출력을 볼 수 있습니다:

0 2 4 6 8 10 12 14 16 18

이처럼 realloc 함수는 이미 할당된 메모리의 크기를 변경하는 데 사용됩니다. 이 함수를 사용하면 메모리 사용 효율을 높이고, 필요에 따라 동적으로 메모리 크기를 조절할 수 있어서 프로그램의 유연성을 크게 향상시킬 수 있습니다.

하지만 realloc 함수 사용 시 주의할 점이 있습니다. realloc은 새로운 메모리 공간을 할당하고, 기존 데이터를 복사한 뒤, 기존 메모리를 해제합니다. 그렇기 때문에, 이 과정에서 메모리 재할당이 실패하면 원래 메모리 공간의 주소를 잃어버릴 수 있으므로, 항상 재할당이 성공했는지 확인하는 코드를 작성해야 합니다.

    int* newArr = (int*)realloc(arr, 10 * sizeof(int));
    if (newArr == NULL)
    {
        printf("메모리 재할당 실패\n");
        free(arr);
        return 1;
    }

    arr = newArr;

이 예제에서 볼 수 있듯이, realloc 함수는 새로운 메모리 주소를 반환하므로, 이를 다른 포인터 변수에 저장합니다. 그리고 이 새로운 포인터가 NULL인지 확인하여 재할당이 성공했는지 확인합니다. 만약 realloc이 실패하면, 함수는 NULL을 반환하고, 기존 메모리는 변경되지 않습니다. 이 경우에는 메모리 누수를 방지하기 위해 원래 할당한 메모리를 free 함수로 해제해야 합니다.

동적 메모리 관리는 C 언어 프로그래밍에서 중요한 개념입니다. 특히, realloc 함수를 통해 이미 할당된 메모리의 크기를 유연하게 변경할 수 있으므로, 메모리를 효율적으로 관리할 수 있습니다. 다만, realloc 함수 사용 시에는 메모리 재할당의 성공 여부를 항상 검사해야 하며, 실패한 경우에는 적절한 메모리 해제 처리를 해주어야 합니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com