살펴볼 내용🚀
C 언어에서 메모리 관리는 매우 중요한 개념입니다.
특히 동적 메모리 할당(dynamic memory allocation) 을 이해하면
더 효율적이고 유연한 프로그램을 작성할 수 있습니다.
이 글에서는 malloc과 free를 중심으로
동적 메모리 관리의 핵심 개념을 살펴보겠습니다. 💡
본 내용
1. 동적 메모리 할당이란? 🤔
C 언어에서 변수를 선언하면,
컴파일러는 해당 변수에 필요한 메모리를 자동으로 할당합니다.
하지만 프로그램 실행 도중
필요한 메모리 크기를
동적으로 결정해야 하는 경우가 많습니다.
예를 들어,
사용자 입력에 따라 크기가 다른 배열을 생성해야 할 수도 있죠.
이러한 경우 동적 메모리 할당을 사용합니다.
동적 메모리 할당을 하면 실행 시간(runtime) 중에 메모리를 확보할 수 있으며,
필요에 따라 크기를 조정할 수도 있습니다.
하지만 개발자가 직접 할당한 메모리를 해제(free)하지 않으면
메모리 누수(memory leak) 가 발생할 수 있으므로 주의해야 합니다. ⚠️
2. malloc 함수: 메모리 동적 할당하기 🏗️
malloc(memory allocation) 함수는
힙(heap) 영역에서 지정한 크기의 메모리를 할당하고,
그 메모리의 시작 주소를 반환합니다.
📌 malloc 사용법
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*) malloc(sizeof(int)); // 정수형 변수 크기만큼 동적 할당
if (ptr == NULL) {
printf("메모리 할당 실패!\n");
return 1;
}
*ptr = 100; // 동적 할당한 메모리에 값 저장
printf("할당된 메모리 값: %d\n", *ptr);
free(ptr); // 메모리 해제
return 0;
}
📌 malloc의 주요 특징
- 반환 값: 성공 시 할당된 메모리의 첫 번째 주소를 반환, 실패 시 NULL 반환
- 메모리 크기 지정: sizeof를 사용하여 정확한 크기를 지정해야 함
- 형 변환: 반환 값은 void* 타입이므로 적절한 자료형으로 형 변환 필요
3. free 함수: 사용한 메모리 해제하기 🗑️
동적으로 할당한 메모리는 반드시 free를 사용하여 해제해야 합니다.
그렇지 않으면 메모리 누수가 발생할 수 있습니다.
📌 free 사용법
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
arr = (int*) malloc(5 * sizeof(int)); // 정수 5개 크기만큼 동적 할당
if (arr == NULL) {
printf("메모리 할당 실패!\n");
return 1;
}
for (int i = 0; i < 5; i++) {
arr[i] = (i + 1) * 10;
}
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
free(arr); // 메모리 해제
return 0;
}
📌 free의 주요 특징
- malloc과 함께 사용: malloc으로 할당한 메모리만 free로 해제 가능
- 해제 후 재사용 불가: free 호출 후 해당 포인터를 사용하면 미정의 동작(undefined behavior) 발생
- 이중 해제 금지: 같은 메모리를 여러 번 해제하면 오류 발생 가능
4. malloc과 free를 사용할 때 주의할 점 ⚠️
❌ 메모리 누수 방지하기
int *ptr;
ptr = (int*) malloc(sizeof(int));
// ptr을 해제하지 않으면 프로그램 종료 후에도 메모리가 반환되지 않음!
free(ptr);을 호출하여 반드시 메모리를 해제해야 합니다.
❌ 해제 후 잘못된 접근 방지
free(ptr);
printf("%d", *ptr); // 잘못된 메모리 접근
메모리를 해제한 후에는 더 이상 해당 포인터를 사용하지 않아야 합니다. 필요하면 ptr = NULL;로 설정하여 실수를 방지할 수 있습니다.
5. calloc과 realloc: malloc의 확장 기능 🛠️
🆕 calloc (Clear Allocation)
- malloc과 비슷하지만, 할당된 메모리를 0으로 초기화
int *arr = (int*) calloc(5, sizeof(int));
🔄 realloc (Resize Allocation)
- 기존에 할당한 메모리 크기를 변경할 때 사용
arr = (int*) realloc(arr, 10 * sizeof(int));
결론 🎯
malloc과 free는 C 언어에서 메모리를 효율적으로 관리하기 위한 핵심 함수입니다.
동적 메모리 할당을 사용할 때는
반드시 메모리를 해제하여 메모리 누수를 방지해야 합니다.
또한,
calloc, realloc을 활용하면
보다 유연한 메모리 관리를 할 수 있습니다.
C 언어의 메모리 관리 개념을 확실히 이해하고,
안전한 프로그래밍을 실천하세요! 🚀