[C 언어 기초] 동적 메모리 할당: malloc과 free 함수

Youngeui Hong·2023년 9월 3일
0

💾 동적 메모리 할당

👀 동적 메모리 할당이란?

동적 메모리 할당(Dynamic Memory Allocation)은 프로그램이 실행되는 도중에 필요한 만큼의 메모리를 할당하는 것을 의미한다.

즉, 정적 메모리 할당은 프로그램이 실행되기 전에 메모리를 미리 할당하는 방식이라면, 동적 메모리 할당은 런타임에 필요한 만큼의 메모리를 요청하고 사용하는 방식이다.

🤔 동적 메모리 할당은 왜 필요할까?

프로그램들이 동적 메모리 할당을 사용하는 가장 중요한 이유는 프로그램을 실제로 실행시키기 전에는 자료 구조의 크기를 알 수 없는 경우가 있기 때문이다.

이러한 상황에서 아래와 같이 배열의 크기를 정해놓고 사용하는 것은 좋지 않은 방법이다.

#define MAXN 15213

int array[MAXN];

배열과 같은 자료구조는 선언시점에 그 크기가 정해지기 때문에, 런타임에 그 크기를 변경하는 것이 불가능하기 때문이다.

MAXN은 임의로 정한 값으로 실제 머신에서 가용한 가상 메모리의 크기와는 무관하고, 프로그램의 사용자가 MAXN보다 더 큰 파일을 읽으려고 한다면 유일한 대책은 MAXN을 수정해서 다시 컴파일하는 것이다.

그렇기 때문에 사용자의 입력을 받아 저장하는 경우처럼 프로그램의 실행 시점에 데이터의 크기를 알 수 있는 상황이라면, 런타임에 동적으로 메모리를 할당하는 것이 더 적절할 것이다.

🤓 동적 메모리 할당은 어떻게 이뤄질까?

동적 메모리 할당기(dynamic memory allocator)는 힙(heap)이라고 불리는 프로세스의 가상 메모리 영역을 다양한 크기의 블록들의 집합으로 관리한다.

힙은 초기화되지 않은 데이터 영역 바로 다음부터 시작해서 위쪽으로, 즉 높은 주소 방향으로 커지는 demand-zero 메모리 영역이라 할 수 있다.

각 프로세스에 대해 커널은 힙의 꼭대기를 가리키는 변수 brk(브레이크)를 사용한다.

동적 메모리 할당에는 프로그래머가 직접 메모리를 할당하고 해제하는 명시적 방식이 있고, 시스템이 자동으로 필요한 만큼의 메모리를 할당하고 해제하는 암묵적 방식이 있다.

c 언어의 경우 malloc, calloc, realloc, free 등의 함수를 사용하여 명시적으로 동적 메모리를 할당할 수 있다.

👀 C 언어와 동적 메모리 할당

C 언어에서는 malloc 함수, free 함수 등을 사용하여 동적으로 메모리를 할당하고 해제할 수 있다.

📍 malloc 함수

#include <stdlib.h>

void *malloc(size_t size);

// Returns pointer to allocated block if OK
// NULL on Error

c 언어에서 프로그램은 메모리가 필요한 경우 malloc 함수를 호출하고, 힙은 적절히 정렬된 최소 사이즈의 바이트를 갖는 메모리 블록의 포인터를 리턴한다.

32 비트 모드에서 malloc은 주소가 항상 8의 배수인 블록을 리턴하고, 64비트 모드에서는 항상 16의 배수인 블록을 리턴한다.

프로그램이 가용한 가상 메모리보다 더 큰 크기의 메모리 블록을 요청하는 등의 문제가 생긴다면 malloc은 NULL을 리턴한다.

따라서 malloc 함수를 호출한 다음에는 반드시 NULL 체크를 해줘야 한다.

📍 free 함수

#include <stdlib.h>

void free(void *ptr);

// Returns: nothing

프로그램은 할당된 힙 블록을 free 함수를 호출해서 반환한다.

ptr 인자는 할당 받은 메모리 블록의 시작지점을 가리켜야 한다.

만약 메모리 영역이 엉뚱한 곳에서 해제되면, 더 이상 유효한 메모리 주소를 가리키지 않는 dangling 포인터를 만들어낼 수 있으므로 free 함수를 사용할 때에는 반드시 알맞은 포인터를 해제하도록 유의해야 한다.

0개의 댓글