메모리의 동적 할당이란 컴퓨터 프로그램이 실행되는 런타임 도중에 사용할 메모리 공간을 할당하는 것을 말한다.
동적 할당을 사용하는 이유는 코드를 작성할 때 메모리에 얼마가 필요한지 정확하게 알 수 없기 때문에 프로그램을 실행하는 도중에 필요한 만큼만 메모리를 할당해 메모리 낭비를 줄일 수 있다.
동적 할당되는 메모리는 힙 영역에 생성되고, 컴파일 타임에 메모리의 크기가 결정되는 데이터 영역이나 스택 영역의 정적 메모리 할당과는 대조적인 개념이다.
malloc 함수를 사용하기 위해서는 <stdlib.h>
또는 <malloc.h>
헤더파일을 사용해야한다.
#include <stdlib.h>
void * malloc(size_t size);
기본 형태는 void 반환형 포인터이다. void인 이유는 할당받은 메모리를 몇 바이트씩 잘라서 사용할지 모르기 때문에 필요에 따라 형변환을 해 사용할 수 있다.
매개변수에는 size_t
를 통해 할당할 메모리의 크기를 넘겨준다
#include <stdio.h>
#include <stdlib.h>
int main() {
char * c = (char*)malloc(1); // 1바이트 메모리 할당, (char*)를 사용해 강제 형변환
*c = 'h';
printf("%d, %c \n", c, *c);
free(c); // 메모리 해제
위 예제는 1바이트의 메모리를 할당해서 char형 포인터에 할당한 주소값을 저장한다.
코드 동작 순서
위 예제처럼 숫자로 메모리를 정해줬지만 보통 일반적으로는 sizeof
를 사용해 할당할 변수의 크기와 그 변수의 개수를 직접 입력한다. malloc(sizeof(char));
와 같이 선언
비슷하게 int
형 변수 4개를 할당 받는 예제
int main() {
int * arr = (int*)malloc(sizeof(int) * 4); // int 사이즈 4개 메모리 할당
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
arr[3] = 400;
printf("%d %d %d %d \n", arr[0], arr[1], arr[2], arr[3]);
free(arr);
}
위 코드를 보면 int 크기에 4를 곱한만큼의 크기를 할당받는다.
그리고 (int*)
로 형변환을 시켜 arr
의 인덱스는 각각 4바이트씩 차이가 난다.
코드 동작 순서
void * malloc(size_t size);
void * calloc(size_t nelem, sizeo_t elsize);
void * realloc(void * ptr, size_t size);
void free(void * ptr);
int * arr = (int *)malloc(sizeof(int) * n);
free(arr);