📌 - 동적 메모리 할당
메모리를 할당하는 방법에는 정적으로 할당하는 정적 할당과 동적으로 할당하는 동적 할당이 있다.
정적할당은 이때까지 계속 사용해왔던 int arr[100]과 같은 고정된 크기의 배열을 정적할당이라고 한다.
그렇다면, 잘 사용하고 있는 배열을 사용하지 않고 동적할당을 사용하는 이유가 무엇일까??
👉 - 정적배열은 처음 생성할 때 크기가 고정되어 있으며, 이러한 문제 때문에 고정된 크기보다 더 큰 입력이 들어오게 된다면 index 에러가 나타나게 되고, 더 작은 입력이 들어오게 되면 남는 만큼 메모리를 사용하지 않아 메모리 낭비로 이어지게 된다.
이런 문제를 해결하기 위해서 동적할당이란 개념을 사용한다.
동적 할당이란?
- 실행 시간동안 사용할 공간을 동적으로 할당하는 것
- 사용이 끝난 뒤에 원하는 시점에 원하는 크기만큼 반납이 가능하다.
어디에서 사용되는가?
👉 - 프로그램 작성시에 메모리가 얼마나 필요한지 전혀 예측하지 못하는 경우에 사용한다.
메모리가 얼마나 필요한지 예측할 수 있는 경우엔 배열을 사용하면 된다.
어떻게 사용하는지?
👉 - 동적배열에는 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를 해서 사용하지 않는 메모리를 해제시켜 줘야한다.