C 기본 문법 – 포인터 – 3 – 동적 메모리 할당

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으로 초기화

💡 callocmalloc과 달리 메모리를 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 언어를 실전에서 쓸 수 있게 만드는 마법 같은 기술이에요!
프로그램이 더 크고 복잡해질수록, 유연한 메모리 관리 능력은 필수입니다.

🎯 정적인 배열이 미리 짜인 도시라면,
동적 메모리는 필요할 때 즉석에서 세워지는 텐트 같아요!
그만큼 자유롭고, 또 책임감도 따르죠 😉

다음 편에서는 이중 포인터, 포인터 배열, 포인터 함수 같은 좀 더 고급 주제로 이어질게요!

궁금한 점이 있다면 언제든지 댓글로 알려주세요~
함께 메모리 마스터가 되어봐요! 💻🔥

답글 남기기