정적 배열은 프로그램 실행 전에 크기가 고정되지만, **동적 메모리 할당(Dynamic Memory Allocation)**을 이용하면 프로그램 실행 중에 필요한 만큼 힙(Heap) 메모리 공간을 원하는 크기로 할당받을 수 있습니다.
1. 동적 메모리 할당 4대 함수 (<stdlib.h>)
malloc(byte_size): 지정한 바이트 수만큼 힙 메모리를 할당 (초기화 안 됨).calloc(num, size): 지정한 크기의 메모리를 할당하고 모든 비트를 0으로 자동 초기화.realloc(ptr, new_size): 이미 할당된 메모리의 크기를 확장하거나 축소.free(ptr): 할당받아 사용이 끝난 메모리를 힙 공간에 반납해 해제.
2. malloc 과 free 사용 표준 코드
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int size = 5;
// 1. int 5개 크기(20 Bytes) 동적 할당
int *arr = (int *)malloc(sizeof(int) * size);
if (arr == NULL) { // 메모리 할당 실패 검사
printf("메모리 할당 실패!\n");
return 1;
}
// 2. 메모리 사용
for (int i = 0; i < size; i++) {
arr[i] = (i + 1) * 10;
printf("%d ", arr[i]);
}
printf("\n");
// 3. 반드시 메모리 해제!
free(arr);
arr = NULL; // 가리키던 포인터 초기화 (Dangling Pointer 방지)
return 0;
}
3. 메모리 누수 (Memory Leak) 주의사항
malloc()으로 할당받은 주소를 free()로 해제하지 않고 프로그램을 계속 돌리면, 사용하지 않는 힙 메모리가 계속 쌓여 컴퓨터 메모리가 부족해지는 메모리 누수(Memory Leak) 현상이 발생합니다.
4. 자주 묻는 질문 (Q&A)
Q. 허공을 가리키는 포인터(Dangling Pointer)란 무엇인가요?
A. free(ptr)로 메모리를 해제한 후에도 ptr 변수에는 이전 메모리 주소가 그대로 남아있습니다. 이 해제된 주소를 다시 참조하려고 접근하면 튕김 사고가 나므로, free() 실행 즉시 ptr = NULL; 로 비워두는 습관이 매우 중요합니다.