컴퓨터 구조/자료 구조

[동적 메모리 할당] - malloc, calloc, realloc

Casteira 2023. 5. 6. 17:01

📌 - 동적 메모리 할당

메모리를 할당하는 방법에는 정적으로 할당하는 정적 할당과 동적으로 할당하는 동적 할당이 있다.

정적할당은 이때까지 계속 사용해왔던 int arr[100]과 같은 고정된 크기의 배열을 정적할당이라고 한다.

 

그렇다면, 잘 사용하고 있는 배열을 사용하지 않고 동적할당을 사용하는 이유가 무엇일까??

 

    👉 - 정적배열은 처음 생성할 때 크기가 고정되어 있으며, 이러한 문제 때문에  고정된 크기보다 더 큰 입력이 들어오게 된다면 index 에러가 나타나게 되고, 더 작은 입력이 들어오게 되면 남는 만큼 메모리를 사용하지 않아 메모리 낭비로 이어지게 된다.

 

이런 문제를 해결하기 위해서 동적할당이란 개념을 사용한다.

 

 

 

동적 할당이란?

  1. 실행 시간동안 사용할 공간을 동적으로 할당하는 것
  2. 사용이 끝난 뒤에 원하는 시점에 원하는 크기만큼 반납이 가능하다.

 

 

 

어디에서 사용되는가?

    👉 - 프로그램 작성시에 메모리가 얼마나 필요한지 전혀 예측하지 못하는 경우에 사용한다.

 

메모리가 얼마나 필요한지 예측할 수 있는 경우엔 배열을 사용하면 된다.

 

 

 

 

어떻게 사용하는지?

    👉 - 동적배열에는 malloc, calloc, realloc을 사용해서 구현하게 된다.

 

 

1️⃣ - malloc()

 

🔺 - malloc 함수의 사용법

void* malloc(size_t size);
int* malloc(size_t size);
char* malloc(size_t size);
BOOK* malloc(size_t size);

 

여러가지 예시

int* list = (int*)malloc(sizeof(int)*10);
int* list = (int*)malloc(sizeof(int)); // 메모리를 얼마나 쓸지 할당 안해도 사용할 수 있다.

char* list = (char*)malloc(sizeof(char)*1);
char* list = (char*)malloc(sizeof(char));


typedef struct car
{
char name[10];
int number;
int price;
struct car* pc;
}CAR;

CAR* c = (CAR*)malloc(sizeof(CAR) * 100);

 

👉 - malloc을 사용한 예시

 

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

int main(){
    
    int *p_num_list, count =0, sum = 0, limit = 0, i;

    printf("사용할 최대 개수를 입력하세요 : ");
    scanf("%d", &limit);

    p_num_list = (int*)malloc(sizeof(int));


    while (1){
        printf("숫자 입력하시오 : ");
        scanf("%d", (p_num_list + count));
        if (*(p_num_list + count) == 9999) break;
        count++;
    }

    for (i = 0 ; i <count;i++){
        if ( i > 0 ) printf("+");
        printf("%d", *(p_num_list + i));
        sum = sum + *(p_num_list+i);

    }
    printf(" = %d\n", sum);
    free(p_num_list);


    return 0;
}

 

 

2️⃣ - calloc()

    - calloc(변수, 자료형의 크기) 이렇게 사용한다.

    - (num, sizeof(int)) -> num 크기 * 4byte

void* calloc(size_t n ,size_t size);

char* p = (char*)calloc(10,sizeof(char));

    👉 - malloc과의 차이점은 매개변수가 2개인 것과 선언할때 0으로 초기화한다는 점이다. 많이 사용하지는 않는다.

    

 

 

3️⃣ - realloc()

    - 할당받은 크기를 재조정한다.

 

   int *p_num_list, count =0, sum = 0, limit = 0, i;

    printf("사용할 최대 개수를 입력하세요 : ");
    scanf("%d", &limit);

    p_num_list = (int*)malloc(sizeof(int));
    p_num_list = realloc(p_num_list, sizeof(int) * 100);

 

 

4️⃣- free()

     - 할당 받은 배열은 항상 free를 해서 사용하지 않는 메모리를 해제시켜 줘야한다.