[C언어] 메모리 동적할당 (malloc, free) 함수 사용법 & 예제

메모리의 동적 할당이란?

"메모리를 동적 할당한다"라는 뜻은 컴퓨터 프로그램이 실행되는 도중인 런타임 도중에 사용할 메모리 공간을 할당하는 것을 말합니다. 동적 할당되는 메모리는 힙 영역에 생성되게 되며 컴파일 타임에 메모리의 크기가 결정되는 데이터 영역이나 스택 영역의 정적 메모리 할당과는 대조적인 개념입니다.

 

malloc 함수 사용법

#include <stdlib.h> //malloc 함수가 포함된 헤더 파일

void* malloc(size_t size)

malloc 함수를 사용하기 위해서는 malloc 함수가 포함되어 있는 <stdlib.h> 헤더나 <malloc.h> 헤더를 포함시켜야 합니다.

 

인자 값
size_t : 동적으로 할당할 메모리의 크기


반환 값
성공시 할당한 메모리의 첫번째 주소 리턴, 실패시 NULL리턴

 

malloc 함수 사용 예제

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

void main()
{
    int* arr;
    arr = (int*)malloc(sizeof(int) * 4); // size 4 동적할당

    arr[0] = 100;
    arr[1] = 200;
    arr[2] = 300;
    arr[3] = 400;

    for (int i = 0; i < 4; i++) {
        printf("arr[%d] : %d\n", i, arr[i]);
    }

    free(arr); //동적할당 해제
}

malloc 예제

배열을 동적으로 할당해야할 경우에는 malloc함수를 사용하여야 합니다. 다른 프로그래밍 언어와는 달리 C언어는 동적으로 size를 결정해야 할 때는 malloc함수를 사용해야만 구현이 가능하니 해당 함수와 익숙해지도록 합시다.

메모리 할당 구조

malloc 함수를 사용하는 방법이 생소하다고 생각하는 분들도 있을 것입니다. malloc함수의 특성 때문인데 malloc은 리턴 값으로 void형 포인터를 리턴합니다. malloc은 메모리만 할당하는 함수이기 때문에 어떠한 데이터 형을 사용하는지 알 수 없습니다. 그렇기에 void포인터를 반환하고 개발자가 알맞게 변환하여 사용할 수 있도록 함수가 설계되어있습니다. 그러므로 위의 예제에서는 리턴된 void*를 int*로 캐스팅한 것입니다. C언어가 오버로딩이 안되기에 어쩔수 없는 부분인 듯 합니다.

 

인자 값으로 sizeof(int)를 하는 이유는 int의 크기만큼을 할당받아야 하니 int의 크기와 할당받을 크기를 서로 곱해주어 최종 메모리의 크기를 넣어주는 것입니다.

 

메모리의 해제 (free)

#include <stdlib.h> // free함수가 포함된 헤더파일

void free(void *ptr);

malloc함수를 사용한 뒤 꼭 메모리를 해제시켜줍시다.

 

인자 값 
ptr : 해제하고자 하는 메모리의 포인터

 

동적 메모리를 할당하면 힙 메모리에 공간이 생성됩니다. 이 공간은 프로그램이 종료될 때까지 존재합니다. 따라서 메모리를 할당만 하고 해제를 해주지 않으면 사용하지는 않는데 메모리 사용량만 계속해서 증가하게 되겠죠. 이러한 현상을 메모리 누수라고 합니다. 즉 동적 할당으로 힙 메모리에 공간을 생성해놓은 뒤 회수하지 않으면 프로그램이 실행되는 동안은 그 공간은 계속해서 살아있게 되고 이는 메모리의 낭비를 초래하여 성능 부하를 일으킬 수 있습니다. 고로 사용하지 않는 메모리는 free함수를 사용하여 꼭 회수해주도록 합시다.

 

댓글

Designed by JB FACTORY