Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 프로그래밍의 동적 메모리 할당이란? 개념부터 예제 코드까지 총정리

동적 메모리 할당(Dynamic Memory Allocation)이란?

동적 메모리 할당은 프로그램이 실행되는 시점(런타임)에 필요한 만큼의 메모리를 확보하는 기법을 말합니다. 컴파일 시점에 크기를 미리 정해두는 정적 메모리 할당과 달리, 프로그램 동작 중에 유연하게 메모리를 관리할 수 있다는 것이 가장 큰 특징입니다.

C 언어에서는 malloc()calloc() 같은 표준 라이브러리 함수를 통해 동적 메모리를 할당할 수 있으며, 이 함수들이 반환하는 메모리의 시작 주소를 포인터 변수에 저장하여 사용합니다.

동적 메모리 할당의 주요 특징

  • 프로그램 단위가 활성화될 때 변수에 대한 메모리가 할당됩니다.

  • 힙(heap)이라는 자료구조 영역을 사용하여 동적 할당을 구현합니다.

  • 메모리 재사용이 가능하며, 더 이상 필요하지 않으면 언제든지 메모리를 해제할 수 있습니다.

  • 메모리를 효율적으로 활용할 수 있어 자원 낭비를 줄입니다.

  • 프로그램 실행 도중 어느 시점에든 메모리를 반납할 수 있습니다.

  • 다만, 정적 메모리 할당에 비해 실행 속도는 다소 느릴 수 있습니다.

예제 코드

아래 프로그램은 동적 메모리 할당 함수를 활용해 입력된 요소들 중 짝수의 합홀수의 합을 각각 계산하는 예제입니다.

#include<stdio.h>
#include<stdlib.h>
void main(){
    //변수 및 포인터 선언//
    int i,n;
    int *p;
    int even=0,odd=0;
    //malloc을 이용해 기본 주소 p를 선언//
    p=(int *)malloc(n*sizeof(int));
    //요소 개수 입력//
    printf("Enter the number of elements : ");
    scanf("%d",&n);
    /*출력 처리 -
    메모리가 성공적으로 할당(예약)되었는지
    확인하기 위해 if문을 사용*/
    if (p==NULL){
        printf("Memory not available");
        exit(0);
    }
    //for문으로 요소들을 해당 위치에 저장//
    printf("The elements are : \n");
    for(i=0;i<n;i++){
        scanf("%d",p+i);
    }
    for(i=0;i<n;i++){
        if(*(p+i)%2==0){
            even=even+*(p+i);
        }
        else{
            odd=odd+*(p+i);
        }
    }
    printf("The sum of even numbers is : %d\n",even);
    printf("The sum of odd numbers is : %d\n",odd);
}

실행 결과

Enter the number of elements : 4
The elements are :
35
24
46
12
The sum of even numbers is : 82
The sum of odd numbers is : 35

코드 설명

  • malloc(n*sizeof(int))은 n개의 정수를 저장할 수 있는 크기만큼 힙 영역에서 메모리를 요청합니다.

  • 반환된 포인터 pNULL인지 검사하여, 메모리 할당 실패 시 안전하게 프로그램을 종료합니다. 이는 동적 할당에서 반드시 거쳐야 하는 오류 처리 과정입니다.

  • 포인터 산술(p+i, *(p+i))을 이용해 배열처럼 각 요소에 접근하고 값을 판별합니다.

  • 사용이 끝난 메모리는 free(p)로 해제하는 것이 원칙이며, 이를 통해 메모리 누수(memory leak)를 방지할 수 있습니다.