동적 메모리 할당 크기 변경: 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 함수 사용 시에는 메모리 재할당의 성공 여부를 항상 검사해야 하며, 실패한 경우에는 적절한 메모리 해제 처리를 해주어야 합니다.

더 깊이 공부하고 싶다면
DevLec에서는 실무 중심의 C#, .NET, ASP.NET Core, Blazor, 데이터 액세스 강좌를 단계별로 제공합니다. 현재 수강 가능한 강좌 외에도 더 많은 과정이 준비되어 있습니다.
DevLec.com에서 자세한 커리큘럼을 확인해 보세요.
DevLec 공식 강의
C# Programming
C# 프로그래밍 입문
프로그래밍을 처음 시작하는 입문자를 위한 C# 기본기 완성 과정입니다.
ASP.NET Core 10.0
ASP.NET Core 10.0 시작하기 MVC Fundamentals Part 1 MVC Fundamentals Part 2
웹 애플리케이션의 구조와 MVC 패턴을 ASP.NET Core로 실습하며 익힐 수 있습니다.
Blazor Server
풀스택 웹개발자 과정 Part 1 풀스택 웹개발자 과정 Part 2 풀스택 웹개발자 과정 Part 3
실무에서 바로 활용 가능한 Blazor Server 기반 관리자·포털 프로젝트를 만들어 봅니다.
Data & APIs
Entity Framework Core 시작하기 ADO.NET Fundamentals Blazor Server Fundamentals Minimal APIs
데이터 액세스와 Web API를 함께 이해하면 실무 .NET 백엔드 개발에 큰 도움이 됩니다.
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com