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()를 사용하여 해제해야 함