Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 메모리 동적 할당 (malloc) 본문

C언어

C언어 - 메모리 동적 할당 (malloc)

깅햄찌 2022. 9. 20. 20:28
반응형

안녕하세요 오늘은 메모리 동적 할당에 대해 정리해보겠습니다. 

 

일반적인 정적 할당은 Compile 단계에서 할당되지만 동적 할당은 runtime 시 메모리에 할당되는 특징이 있는데요.

먼저 메모리 동적 할당하면 빠질 수 없는 malloc, free 함수의 예제를 보면서 정리해보아요~

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

int main(){
    int *pi;

    pi = (int *)malloc(sizeof(int));
    if(pi == NULL){
        printf("out of memory");
        exit(1);
    }

    *pi = 5;
    printf("*pi : %d\n",*pi);

    free(pi);
    
    return 0;
}

1.  malloc, free 함수는 stdlib.h 헤더 파일에 선언되어 있습니다. 

2. 동적 할당 하는 법

    포인터 변수 = (할당할 포인터 변수의 자료형) + malloc(포인터 변수가 가리키는 자료형의 크기)

    ex) pi = (int*)malloc(sizeof(int))

3. pi가 NULL 일 때 : 메모리가 부족하다는 뜻이므로 예외처리를 해줍니다. 

4. free 함수를 이용해 할당한 메모리 영역을 반환합니다. 

   c 언어에서 메모리 관리는 중요한 부분인데요.

   동적 할당 후 free 즉, 메모리 영역을 해제하지 않으면 계속 점유하여 메모리 누수 발생의 확률을 높입니다. 

   메모리 해제를 하지 않아도 문법적으로 틀린 것은 아니므로 compiler에서 오류를 띄우지 않습니다. 

   따라서 효율적인 메모리 사용을 위해 반드시 메모리 사용 후 해제를 해주어야 합니다. 

 

아래 결과처럼 동적 할당된 포인터 변수 pi로 정수 5를 출력할 수 있음을 확인했습니다. 

 

두 번째 예제로 동적 할당 영역을 배열처럼 활용해 보겠습니다.

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

int main(){
    int *pi;

    pi = (int *)malloc(5 * sizeof(int));
    if(pi == NULL){
        printf("out of memory");
        exit(1);
    }

    for(int i=0; i<5; i++){
        pi[i] = i;
        printf("pi[i] : %d\n",pi[i]);
    }

    free(pi);

    return 0;
}

    pi = (int*)malloc(5 * sizeof(int)) => 포인터 변수가 가리키는 자료형의 크기가 정수형 5개

    즉, 5개의 정수형 요소를 가진 배열을 할당한 것과 같은 기능을 합니다. 

 

동적 할당을 하는 이유

1. 최근 메모리의 저장 공간은 과거와 비교해서 상대적으로 충분하지만

여전히 리소스 관리 측면에서 동적 할당이 필요합니다. 

예를 들어, 프로그램 실행 시 크기가 큰 프로세스가 계속해서 메모리를 점유하고 있다면

비효율적이라는 것을 예상할 수 있습니다. 

프로세스가 필요할 때마다 동적 할당을 통해 메모리 할당 및 해제를 반복하면

리소스를 더욱 효율적으로 관리할 수 있을 것입니다. 

2. 변수의 크기를 예측할 수 없을 때 동적 할당이 필요합니다. 

메모리 할당의 크기를 너무 크게 잡아 메모리의 낭비가 있을 수 있고

반대로 메모리 할당의 크기를 너무 작게 잡아 메모리의 부족이 있을 수 있습니다. 

동적 할당은 메모리의 필요에 따라 할당을 요청할 수 있어 위의 문제에 해결책이 될 수 있습니다. 

 

 

오늘은 전반적인 메모리 동적 할당에 대하여 정리해보았습니다. 

 

다음 포스팅에서는 malloc 이외의 동적 할당 함수와 기타 동적 할당 저장 공간의 활용을 다뤄보겠습니다. 

 

좋은 하루 보내세요~~

Comments