c 언어

C 언어의 동적 메모리 할당

임베디드 친구 2024. 12. 14. 11:14
반응형

동적 메모리 할당(dynamic memory allocation)은 C 프로그래밍에서 메모리를 효율적으로 관리하고 프로그램 실행 중에 필요한 메모리 공간을 할당하거나 해제할 수 있도록 도와주는 중요한 개념입니다. 이 글에서는 C 언어에서 제공하는 동적 메모리 할당 함수들과 사용법, 주의사항, 그리고 실용적인 예제를 포함하여 5000자 내외로 상세히 설명하겠습니다.

1. 동적 메모리 할당이란?

C 언어에서 변수는 일반적으로 스택(stack)에 할당됩니다. 하지만 스택 크기는 제한적이며 컴파일 시 크기를 미리 정의해야 하는 경우가 많습니다. 힙(heap) 영역을 사용하면 프로그램 실행 중에도 유연하게 메모리를 할당하고 해제할 수 있습니다. 이를 동적 메모리 할당이라고 하며, C 언어에서는 표준 라이브러리에서 제공하는 함수들을 사용합니다.

2. 주요 함수 소개

C 언어에서 동적 메모리 할당 및 해제를 위해 사용하는 주요 함수는 다음과 같습니다:

함수 역할
malloc 지정한 바이트만큼 메모리를 할당합니다.
calloc 지정한 개수와 크기의 메모리를 초기화하며 할당합니다.
realloc 기존 할당된 메모리 크기를 변경합니다.
free 할당된 메모리를 해제합니다.

2.1 malloc

malloc 함수는 메모리 블록을 동적으로 할당합니다. 반환되는 메모리 공간은 초기화되지 않으며, void* 포인터를 반환합니다.

#include <stdlib.h>

int *arr = (int *)malloc(10 * sizeof(int));
if (arr == NULL) {
    printf("메모리 할당 실패\n");
    return 1;
}

2.2 calloc

calloc 함수는 malloc과 유사하지만, 할당된 메모리를 모두 0으로 초기화합니다.

#include <stdlib.h>

int *arr = (int *)calloc(10, sizeof(int));
if (arr == NULL) {
    printf("메모리 할당 실패\n");
    return 1;
}

2.3 realloc

realloc 함수는 기존의 메모리 블록 크기를 변경하거나 새로 할당합니다.

#include <stdlib.h>

arr = (int *)realloc(arr, 20 * sizeof(int));
if (arr == NULL) {
    printf("메모리 재할당 실패\n");
    return 1;
}

2.4 free

free 함수는 할당된 메모리 블록을 해제하여 메모리 누수를 방지합니다.

free(arr);

3. 동적 메모리 할당의 활용 예제

3.1 간단한 배열 할당과 해제

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    printf("배열의 크기를 입력하세요: ");
    scanf("%d", &n);

    int *arr = (int *)malloc(n * sizeof(int));
    if (arr == NULL) {
        printf("메모리 할당 실패\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    printf("배열 요소: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr);
    return 0;
}

3.2 2차원 배열 동적 할당

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows = 3, cols = 4;
    int **matrix = (int **)malloc(rows * sizeof(int *));

    if (matrix == NULL) {
        printf("메모리 할당 실패\n");
        return 1;
    }

    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
        if (matrix[i] == NULL) {
            printf("메모리 할당 실패\n");
            return 1;
        }
    }

    // 초기화 및 출력
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = i * cols + j;
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 메모리 해제
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);

    return 0;
}

4. 주의사항

4.1 메모리 누수 방지

malloc 또는 calloc으로 할당한 메모리는 반드시 free를 사용하여 해제해야 합니다. 그렇지 않으면 메모리 누수가 발생하여 프로그램의 성능과 안정성에 문제가 생길 수 있습니다.

4.2 포인터 초기화

free 함수로 메모리를 해제한 후 포인터를 NULL로 초기화하지 않으면 댕글링 포인터(dangling pointer) 문제가 발생할 수 있습니다.

free(arr);
arr = NULL;

4.3 재할당된 메모리 사용 시 초기화

realloc 함수로 메모리를 재할당하면, 새로 추가된 메모리는 초기화되지 않습니다. 따라서 새 메모리를 사용하기 전에 명시적으로 초기화해야 합니다.

5. 결론

동적 메모리 할당은 C 언어에서 메모리를 효율적으로 관리하고, 실행 중 다양한 메모리 요구를 처리할 수 있도록 도와줍니다. 하지만 잘못된 사용은 메모리 누수, 댕글링 포인터 등 다양한 문제를 초래할 수 있으므로 항상 주의해야 합니다. 위에서 소개한 예제를 연습하며 동적 메모리 할당의 기본 원리를 이해하고, 실제 프로젝트에서 유용하게 활용해 보세요.

반응형