C 기본 문법 – 포인터 – 3편: 동적 메모리 할당 완전 정복
안녕하세요, 여러분! 😊
이번 시간에는 C 언어에서 포인터의 진정한 힘을 느낄 수 있는 주제, 바로 **동적 메모리 할당(Dynamic Memory Allocation)**에 대해 알아보겠습니다!
🧠 동적 메모리 할당이란?
프로그램 실행 중에 필요한 만큼 메모리를 직접 할당하고 해제하는 방식이에요.
마치 방 크기를 미리 정해두는 게 아니라, 필요할 때 예약하고, 다 쓰면 반납하는 호텔처럼요!
정적 배열은 크기를 고정해야 하지만, 동적 메모리는 유연하게 관리할 수 있어서,
실제로 많은 프로그램에서 필수적으로 사용됩니다.
그럼 이제 메모리의 세계로 한 걸음 들어가 볼까요? 🚪✨
1. 왜 동적 메모리 할당이 필요한가요?
정적 배열의 한계
int arr[100]; // 고정 크기, 메모리 낭비 or 부족 우려
- 크기를 미리 예측해야 함
- 큰 메모리 공간을 쓸 수도 있어 비효율적
동적 메모리의 장점
- 실행 중 필요한 크기만큼 메모리 할당 가능
- 배열, 구조체 등 복잡한 데이터 구조에 적합
- 메모리 절약 및 유연성 제공
2. 동적 메모리 할당 함수
C 언어에서 표준 라이브러리를 통해 제공하는 대표 함수들은 다음과 같아요:
함수 | 설명 |
---|---|
malloc(size) |
지정한 바이트만큼 메모리 할당 |
calloc(n, size) |
n개의 요소를 size만큼 초기화하며 할당 |
realloc(ptr, size) |
기존 메모리 크기를 조절 |
free(ptr) |
할당된 메모리 해제 |
📌 이 함수들을 사용하려면
#include <stdlib.h>
를 반드시 선언해야 해요!
3. malloc 사용법
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int *)malloc(sizeof(int) * 5); // int 5개 분량 할당
if (p == NULL) {
printf("메모리 할당 실패!
");
return 1;
}
for (int i = 0; i < 5; i++)
p[i] = (i + 1) * 10;
for (int i = 0; i < 5; i++)
printf("%d ", p[i]); // 출력: 10 20 30 40 50
free(p); // 메모리 해제
return 0;
}
🎯
malloc
은 초기화 안 되므로 값을 직접 설정해야 해요!
4. calloc 사용법 (초기화 포함)
int *p = (int *)calloc(5, sizeof(int)); // 5개 int, 모두 0으로 초기화
💡
calloc
은malloc
과 달리 메모리를 0으로 초기화해준다는 차이점이 있어요!
5. realloc로 메모리 크기 조절
int *p = (int *)malloc(sizeof(int) * 3);
p = (int *)realloc(p, sizeof(int) * 6); // 3 → 6개로 확장
- 기존 데이터 유지됨
- 새로운 크기의 메모리 공간으로 이동될 수도 있음
- 이전 포인터는 더 이상 사용하지 말고 새 포인터로만 접근
6. free로 메모리 해제하기
free(p);
p = NULL; // 습관적으로 NULL로 초기화
⚠️
free()
하지 않으면 메모리 누수(leak) 발생 가능!
7. 동적 메모리로 배열 다루기
int n;
printf("배열 크기 입력: ");
scanf("%d", &n);
int *arr = (int *)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
arr[i] = i * 2;
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
free(arr);
🧮 사용자 입력에 따라 유연하게 배열 생성 가능!
8. 구조체에 사용하는 예시
typedef struct {
char name[20];
int age;
} Person;
Person *p = (Person *)malloc(sizeof(Person));
strcpy(p->name, "홍길동");
p->age = 30;
printf("%s (%d세)
", p->name, p->age);
free(p);
💡 구조체도 malloc을 이용해 동적으로 생성할 수 있어요!
✅ 동적 메모리 할당 요약
함수 | 역할 | 특징 |
---|---|---|
malloc(size) |
메모리 할당 | 초기화 안 됨 |
calloc(n, size) |
메모리 할당 + 초기화 | 0으로 초기화 |
realloc(ptr, new_size) |
크기 조절 | 기존 내용 유지 |
free(ptr) |
해제 | 꼭 사용 후 해제 필요 |
⚠️ 동적 메모리 사용 시 주의사항
주의사항 | 설명 |
---|---|
할당 확인 | 항상 NULL 체크 필요 |
할당 후 초기화 | malloc 은 초기화 안 되므로 직접 초기화 |
메모리 해제 | free() 를 반드시 호출 |
이중 해제 금지 | 같은 포인터 두 번 해제하면 에러 발생 |
메모리 누수 조심 | 할당만 하고 해제하지 않으면 누적됨 |
해제 후 접근 금지 | free() 된 포인터에 접근하면 Segmentation Fault 발생 |
마무리하며 💬
동적 메모리는 C 언어를 실전에서 쓸 수 있게 만드는 마법 같은 기술이에요!
프로그램이 더 크고 복잡해질수록, 유연한 메모리 관리 능력은 필수입니다.
🎯 정적인 배열이 미리 짜인 도시라면,
동적 메모리는 필요할 때 즉석에서 세워지는 텐트 같아요!
그만큼 자유롭고, 또 책임감도 따르죠 😉
다음 편에서는 이중 포인터, 포인터 배열, 포인터 함수 같은 좀 더 고급 주제로 이어질게요!
궁금한 점이 있다면 언제든지 댓글로 알려주세요~
함께 메모리 마스터가 되어봐요! 💻🔥