C언어 초급 - 11장: 동적 메모리 할당 (11.1 동적 메모리 할당의 필요성)
2025. 2. 24. 11:49ㆍ프로그래밍 언어/C
11.1 동적 메모리 할당의 필요성
1. 동적 메모리 할당이란?
동적 메모리 할당(Dynamic Memory Allocation)은 프로그램 실행 중에 메모리를 할당하고 해제하는 기능입니다.
C 언어에서 메모리는 크게 정적 메모리(Static Memory)와 동적 메모리(Dynamic Memory) 로 나뉩니다.
1.1 정적 메모리 할당(Static Memory Allocation)
- 컴파일 시 메모리 크기가 결정됨.
- int arr[100]; → 한 번 크기를 지정하면 변경 불가.
- 배열 크기를 미리 예측해야 하므로 비효율적일 수 있음.
1.2 동적 메모리 할당(Dynamic Memory Allocation)
- 프로그램 실행 중에 메모리 크기를 조정 가능.
- malloc(), calloc(), realloc() 함수를 사용하여 힙(Heap) 영역에 메모리를 할당.
- 필요할 때 free()를 사용하여 메모리를 해제해야 함.
📌 동적 메모리 할당을 사용하면 메모리를 효율적으로 관리할 수 있음!
📌 배열 크기를 미리 정하지 않아도 됨 → 입력 데이터 크기에 따라 유연하게 조절 가능.
2. 동적 메모리 할당 함수
C 언어에서는 stdlib.h 헤더 파일을 포함하여 malloc(), calloc(), realloc(), free()를 사용할 수 있습니다.
2.1 malloc() - 메모리 할당
- 지정한 크기만큼 메모리를 동적으로 할당하고, 할당된 메모리의 주소를 반환합니다.
- 초기화되지 않은 쓰레기 값(Garbage Value)이 포함됨.
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
// 정수 5개를 저장할 메모리 할당
ptr = (int *)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
printf("동적 메모리 할당 성공\n");
free(ptr); // 메모리 해제
return 0;
}
실행 예시
동적 메모리 할당 성공
📌 설명
- malloc(5 * sizeof(int)) → 5개의 정수를 저장할 메모리 할당.
- ptr == NULL이면 메모리 할당 실패 (메모리가 부족할 경우).
- free(ptr); → 할당된 메모리는 반드시 해제해야 함.
2.2 calloc() - 초기화된 메모리 할당
- malloc()과 유사하지만, 할당된 메모리를 0으로 초기화합니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
// 정수 5개를 저장할 메모리 할당 (모든 값이 0으로 초기화됨)
ptr = (int *)calloc(5, sizeof(int));
if (ptr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
printf("calloc()으로 할당된 메모리 값: ");
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]); // 모든 값이 0으로 초기화됨
}
free(ptr); // 메모리 해제
return 0;
}
출력 결과
calloc()으로 할당된 메모리 값: 0 0 0 0 0
📌 설명
- calloc(5, sizeof(int)) → 5개의 int 크기 메모리를 할당하고, 모든 값을 0으로 초기화.
- malloc()과 다르게 초기값이 0으로 설정됨.
2.3 realloc() - 메모리 크기 변경
- 기존 malloc() 또는 calloc()으로 할당된 메모리 크기를 변경할 때 사용.
- 기존 데이터를 유지하면서 크기를 늘리거나 줄일 수 있음.
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int *)malloc(3 * sizeof(int)); // 정수 3개 크기 할당
if (ptr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
printf("메모리 재할당 전 주소: %p\n", ptr);
// 크기를 5개의 정수를 저장할 수 있도록 변경
ptr = (int *)realloc(ptr, 5 * sizeof(int));
if (ptr == NULL) {
printf("메모리 재할당 실패\n");
return 1;
}
printf("메모리 재할당 후 주소: %p\n", ptr);
free(ptr); // 메모리 해제
return 0;
}
출력 예시
메모리 재할당 전 주소: 0x7ffee3b3d9c0
메모리 재할당 후 주소: 0x7ffee3b3d9e0
📌 설명
- realloc(ptr, 5 * sizeof(int)) → 메모리 크기를 조정.
- 새로운 크기의 메모리를 할당하고 기존 데이터를 유지.
- 기존 위치에서 크기를 조정할 수 없으면 새로운 주소를 반환하고 기존 데이터를 복사.
✅ 동적 배열을 사용할 때 매우 유용함!
2.4 free() - 동적 메모리 해제
- malloc(), calloc(), realloc()으로 할당된 메모리를 해제하여 메모리 누수를 방지합니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
printf("메모리 할당 후 ptr: %p\n", ptr);
free(ptr); // 메모리 해제
printf("메모리 해제 완료\n");
return 0;
}
출력 예시
메모리 할당 후 ptr: 0x7ffee3b3d9c0
메모리 해제 완료
📌 설명
- free(ptr);을 호출하면 해당 메모리가 반환됨.
- 해제된 메모리는 다시 접근하면 안 됨 (Dangling Pointer 문제 발생 가능).
3. 정리
함수 | 설명 | 사용 예제 |
malloc(size) | 지정한 크기의 메모리를 할당 (초기화 없음) | int *p = (int *)malloc(10 * sizeof(int)); |
calloc(n, size) | n개의 메모리를 할당하고 0으로 초기화 | int *p = (int *)calloc(10, sizeof(int)); |
realloc(ptr, new_size) | 기존 할당된 메모리 크기를 변경 | p = (int *)realloc(p, 20 * sizeof(int)); |
free(ptr) | 동적으로 할당된 메모리를 해제 | free(p); |
📌 malloc()은 초기화되지 않은 메모리를 할당하지만, calloc()은 0으로 초기화된 메모리를 할당함
📌 realloc()을 사용하면 기존 데이터를 유지하면서 크기를 조정할 수 있음
📌 메모리 할당 후에는 반드시 free()를 사용하여 해제해야 함
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 초급 - 12장: 파일 입출력 (12.1 파일 입출력 개요) (0) | 2025.02.24 |
---|---|
C언어 초급 - 11장: 동적 메모리 할당 (11.2 메모리 누수 방지와 free() 함수의 중요성) (0) | 2025.02.24 |
C언어 초급 - 10장: 포인터 (10.3 포인터와 함수) (0) | 2025.02.24 |
C언어 초급 - 10장: 포인터 (10.2 포인터의 기본 연산) (0) | 2025.02.24 |
C언어 초급 - 10장: 포인터 (10.1 포인터의 개념) (0) | 2025.02.24 |