동적할당
기술노트
[C] 동적 메모리 할당 (Dynamic Memory Allocation)
동적 할당이란?
프로그램 실행 중에 동적으로 메모리를 할당하는 것을 의미하며, 힙(Heap) 영역에 메모리를 확보한다. 정적 메모리 할당(static allocation)과 달리, 실행 중 필요한 만큼 메모리를 확보할 수 있어 유연한 메모리 관리가 가능하다.
특징
- 동적 메모리 할당에는
#include <stdlib.h>
헤더 파일이 필요하다. - 할당된 메모리는 free() 함수를 사용하여 명시적으로 해제해야 한다.
- 메모리를 해제하지 않으면 메모리 누수(memory leak)가 발생할 수 있다.
주요 동적 메모리 관련 함수
- malloc - 원하는 크기만큼 메모리를 할당
*void* malloc(size_t size)
* 예:malloc(sizeof(int) * 4)
→ int형 4개만큼 메모리 할당
- calloc - 메모리 할당과 동시에 0으로 초기화
* void* calloc(size_t nelem, size_t elsize)
* 첫 번째 인자: 요소 개수, 두 번째 인자: 요소 크기
- realloc - 기존 메모리 블록의 크기를 변경 (확장 또는 축소)
* void* realloc(void* ptr, size_t size)
* 원래 데이터는 유지됨
- free - 동적으로 할당된 메모리를 해제
* void free(void* ptr)
예제 코드
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int arr[4] = { 4, 3, 2, 1 };
int* pArr;
// 동적할당: int형 4개만큼 메모리 할당
pArr = (int*)malloc(sizeof(int) * 4);
if (pArr == NULL) {
printf("malloc error\n");
exit(1);
}
// 배열 복사
for (int i = 0; i < 4; ++i) {
pArr[i] = arr[i];
}
// 출력
for (int i = 0; i < 4; ++i) {
printf("%d\n", pArr[i]);
}
// 메모리 해제
free(pArr);
return 0;
}
코드 설명
(int*)
: malloc은 반환형이void*
이므로int*
로 형 변환sizeof(int)
: int형의 바이트 크기 (일반적으로 4바이트)malloc(sizeof(int) * 4)
: int형 변수 4개 분량의 메모리 확보free(pArr)
: 사용이 끝난 후 반드시 메모리 해제
정리
동적 메모리 할당은 메모리를 유동적으로 사용하는 데 매우 유용하지만, 해제를 잊으면 시스템 성능 저하나 오류를 유발할 수 있다. 따라서 메모리를 적절히 할당하고, 사용 후 반드시 free()
로 해제하는 습관이 중요하다.