C언어 기초

[C언어 기초] 메모리 동적할당(malloc)

MNMNWVWV 2023. 3. 8. 22:47
728x90
반응형

 

C언어는 정적할당과 동적할당 두 가지 할당 방법을 제공합니다. 정적할당은 프로그램이 실행될 때 메모리를 할당하고, 이후에는 할당된 메모리의 크기나 위치를 변경할 수 없습니다. 이와는 달리, 동적할당은 프로그램이 실행 중에 필요한 메모리를 할당하고 해제할 수 있습니다. 이번 글에서는 C언어의 동적할당에 대해 자세히 살펴보겠습니다.

동적할당의 개념

동적할당은 프로그램이 실행 중에 필요한 메모리를 할당하는 방법입니다. 이를 통해 프로그램의 유연성을 높일 수 있습니다. 예를 들어, 프로그램이 실행 중에 데이터를 읽어들이거나 생성하는 경우, 정적할당된 메모리 공간은 필요한 만큼 커지지 않을 수 있습니다. 이 때 동적할당을 사용하면 필요한 메모리 공간을 할당하고, 사용이 끝나면 해제할 수 있습니다.

 

 

동적할당을 위한 함수

C언어에서는 메모리 할당과 해제를 위해 malloc()과 free() 함수를 제공합니다.

 

 

malloc()

malloc() 함수는 메모리를 동적으로 할당하는 함수입니다. 함수의 원형은 다음과 같습니다.

1
void* malloc(size_t size);
cs

이 함수는 size 바이트 크기의 메모리 공간을 할당하고, 할당된 메모리의 첫 번째 바이트를 가리키는 포인터를 반환합니다. 할당된 메모리 공간은 초기화되지 않으므로, 필요한 경우 명시적으로 초기화해야 합니다.

 

 

free()

free() 함수는 malloc() 함수를 사용하여 할당한 메모리를 해제하는 함수입니다. 함수의 원형은 다음과 같습니다.

1
void free(void* ptr);
cs

이 함수는 ptr이 가리키는 메모리 공간을 해제합니다. ptr은 malloc() 함수가 반환한 포인터입니다.

 

반응형
동적할당의 예제

다음은 동적할당을 사용하여 정수 배열을 생성하는 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int n, i, *ptr;
 
    printf("Enter the number of elements: ");
    scanf("%d"&n);
 
    ptr = (int*)malloc(n * sizeof(int));
 
    if (ptr == NULL) {
        printf("Memory allocation failed!\n");
        exit(1);
    }
 
    printf("Enter the elements:\n");
    for (i = 0; i < n; i++) {
        scanf("%d"&ptr[i]);
    }
 
    printf("You entered:\n");
    for (i = 0; i < n; i++) {
        printf("%d ", ptr[i]);
    }
    printf("\n");
 
    free(ptr);
 
    return 
cs

 

 

메모리 누수와 관리

동적할당을 사용하면 프로그램이 실행 중에 필요한 메모리를 할당하고 해제할 수 있습니다. 하지만 이러한 동적할당을 잘못 사용하면 메모리 누수(memory leak)가 발생할 수 있습니다. 메모리 누수란, 할당된 메모리를 해제하지 않아 메모리 공간이 계속해서 쌓이는 현상을 말합니다. 이는 프로그램의 성능을 저하시키고, 시스템 리소스를 소모하는 원인이 됩니다.

동적할당을 사용할 때는 항상 할당된 메모리를 해제해야 합니다. 이를 위해 free() 함수를 사용합니다. free() 함수를 호출하기 전에는 반드시 해당 메모리를 참조하는 모든 포인터를 해제해야 합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다.

 

메모리 누수를 방지하기 위해서는 메모리 관리에 대한 충분한 이해가 필요합니다. 메모리 관리는 프로그램 개발에서 가장 중요한 부분 중 하나입니다. 이를 위해 메모리 할당과 해제를 관리하는 알고리즘과 데이터 구조를 잘 이해해야 합니다.

 

동적할당의 활용

동적할당은 프로그램에서 다양한 용도로 활용됩니다. 다음은 동적할당의 일반적인 용도입니다.

 

 

1. 배열과 구조체

동적할당을 사용하여 배열이나 구조체를 생성할 수 있습니다. 이를 통해 배열이나 구조체의 크기를 런타임에 결정할 수 있습니다.

 

2. 문자열 처리

문자열은 C언어에서 char형 배열로 표현됩니다. 문자열의 길이를 미리 알 수 없는 경우 동적할당을 사용하여 문자열을 생성할 수 있습니다.

 

3. 그래프와 트리

그래프와 트리는 동적할당을 활용하여 구현됩니다. 그래프와 트리의 노드는 구조체로 표현됩니다. 노드의 개수가 런타임에 결정되는 경우 동적할당을 사용하여 노드를 생성할 수 있습니다.

 

 

결론

 

C언어에서 동적할당은 프로그램의 유연성을 높이는 중요한 기능 중 하나입니다. 동적할당을 사용하면 런타임에 필요한 메모리를 할당하고 해제할 수 있습니다. 하지만 이를 잘못 사용하면 메모리 누수가 발생할 수 있으므로, 항상 할당된 메모리를 해제해야 합니다. 또한, 동적할당은 메모리 누수를 방지하고, 메모리 관리에 대한 충분한 이해가 필요합니다.

728x90
반응형