동적 메모리 할당 (C)

  • 6 minutes to read

C 언어에서는 사용자가 직접 동적으로 메모리를 할당하고 사용한 후 할당된 메모리를 해제할 수 있습니다. 이러한 일련의 절차를 동적 메모리 할당이라고 합니다.

정적(Static) 메모리 할당과 동적(Dynamic) 메모리 할당

  • 정적 메모리 할당
    • 스택 메모리에 저장
    • 컴파일 시점에 할당
    • 수작업으로 메모리 해제 필수
  • 동적 메모리 할당
    • 힙 메모리에 저장
    • 런타임 시점에 할당
    • 자동으로 메모리 해제 가능
TIP

C 언어에서 사용되는 malloc, free, calloc, realloc, newdelete 등의 함수는 힙 메모리에 할당하기에 힙 함수라고 합니다.

malloc 함수

C 언어에서 동적으로 메모리를 할당할 때에는 malloc() 함수를 사용합니다. malloc() 함수는 stdlib.h 헤더 파일에 정의되어 있습니다.

malloc() 함수의 시그니처는 다음과 같습니다.

void *malloc(size_t byte_size)
  • 32비트 정수를 단일 인자로 받습니다.
  • 메모리 포인터를 반환값으로 전달합니다.

malloc() 함수를 사용한 동적 메모리 할당 관련 코드 조각은 다음과 같습니다.

int* num = malloc(sizeof(int));

int* ptr = (int*)malloc(sizeof(int));
  • malloc() 함수에는 정확한 크기의 값을 지정해야 합니다. 이때 반드시 sizeof 연산자로 크기를 지정합니다.

주의할 점은 동적으로 할당된 변수는 사용한 후에 반드시 free() 함수로 메모리 해제를 해주어야 합니다.

free(num);
free(ptr);
TIP

calloc 함수도 있지만 malloc 함수보다 느립니다.

realloc 함수

C 언어에서 동적으로 메모리를 다시 할당할 때에는 realloc() 함수를 사용합니다. realloc() 함수는 stdlib.h 헤더 파일에 정의되어 있습니다.

realloc() 함수의 시그니처는 다음과 같습니다.

void *realloc(void *ptr, size_t byte_size)
  • 32비트 정수를 단일 인자로 받습니다.
  • 다시 할당된 메모리 포인터를 반환값으로 전달합니다.

realloc() 함수를 사용한 동적 메모리 할당 관련 코드 조각은 다음과 같습니다.

num = (int*)realloc(num, sizeof(int) * 2); // 크기를 2배로 증가하여 다시 할당

ptr = (int*)malloc(ptr, sizeof(int) * 3); // 크기를 3배로 증가하여 다시 할당 

free 함수

C 언어에서 동적으로 할당된 메모리를 해제하려면 free() 함수를 사용합니다. free() 함수는 stdlib.h 헤더 파일에 정의되어 있습니다.

free() 함수의 시그니처는 다음과 같습니다.

void *free(void *ptr)
  • 메모리를 해제할 포인터를 인자로 받습니다.

free() 함수를 사용한 동적 메모리 할당 관련 코드 조각은 다음과 같습니다.

int* num = (int*)free(sizeof(int));

free(num);
  • free() 함수에는 힙 메모리에 할당된 포인터를 해제합니다.

예제: 동적 메모리 할당, 사용, 해제

다음 코드는 C 언어에서동적 메모리 할당에 대한 가장 최소한의 코드를 보여줍니다.

코드: memory_allocation.c

// memory_allocation.c
// 동적 메모리 할당
#include <stdio.h>
#include <stdlib.h> // malloc 함수 사용을 위한 헤더 파일 추가 

int main(void)
{
    //[1] 포인터 변수 선언
    int* num;

    //[2] 메모리 할당
    num = (int*)malloc(sizeof(int)); // 반드시 sizeof 연산자로 크기 지정

    if (num) // 유효성 검사: NULL이 아니면 num 변수 사용
    {
        //[3] 할당된 공간에 값 대입
        *num = 1234;

        //[4] 포인터 변수의 값 참조
        printf("%d\n", *num); // 1234 

        //[5] 메모리 해제
        free(num);
    }

    return 0;
}

결과

1234

num = (int*)malloc(sizeof(int)) 코드를 사용하면 int 타입의 크기 만큼의 포인터를 만들어 num 변수에 할당해줍니다. 처음 이 코드를 보면 복잡해 보이는데요. 다음 3단계로 이해해도 됩니다.

num = malloc(4)
num = malloc(sizeof(int))
num = (int*)malloc(sizeof(int))

위 세 가지 스타일의 코드 중 하나를 사용해도 실행은 될 수 있습니다만 마지막 형태를 반드시 사용하기를 추천합니다.

단순하게 int 타입의 변수를 선언하고 초기화하고 사용하려면 malloc 함수를 사용할 필요가 없습니다. 하지만 포인터 변수는 메모리를 처음 할당하거나 다시 할당할 때에는 반드시 malloc 함수 등을 사용하여 메모리를 할당하고 사용해야 합니다.

C 언어 동적 메모리 할당 동영상 강의

참고 강좌

C 언어 동적 메모리 할당에 대한 참고 강좌는 다음 경로를 참고하거나 데브렉 사이트의 동영상 강의들을 참고하세요.

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