[C] 동적메모리 사용하기
#include <stdio.h>
#include <malloc.h>
void main()
{
int *p = (int *)malloc(12);
// 12바이트의 heap을 4바이트 크기의 포인터에 할당하였음. 12바이트를 4바이트씩 세그룹으로 나눠서 사용하는 것임.
// 처음 4바이트는 *(p+0) , 다음 4바이트는 *(p+1), *(p+2) 식으로 사용할 수 있음.
// 이러한 접근은 int data[3]과 같이 정적으로 할당된 메모리와 같은 목적으로 사용 가능.
// 똑같은 12바이트라고 하더라도 둘은 그룹별로 갖는 바이트 수가 다른데, sizeof(type)을 이용하면 메모리 그룹을 나누는 의도를 보다더 명확히 나타낼 수 있음.
short *p = (short *)malloc(sizeof(short) * 6);
int* p = (int *)malloc(sizeof(int) * 3);
// 배열(정적할당)을 사용할때는 배열의 크기를 변수로 둘 수 없었기 떄문에 항상 그 크기에 신경써야 한다.
// 이는 필연적으로 메모리 낭비 혹은 메모리 부족을 야기할 수 밖에 없다.
}
// 예를 들어 숫자를 입력받고 그 숫자들의 합을 출력하는 함수의 경우
======================
아래의 경우 배열의 숫자를 늘리기 위해서는 컴파일을 다시 해야한다.
그렇다고 모든 경우를 포함하기 위해 MAX_COUNT를 굉장히 크게 설정한다면 메모리 낭비가 발생한다.
#include <stdio.h>
# define MAX_COUNT 5
void main()
{
int num[MAX_COUNT];
int count = 0, sum = 0, i;
while(count < MAX_COUNT)
{
printf("type number(9999 for quit) : ");
scanf_s("%d", num + count);
if (num[count] == 9999) break;
count++;
}
for (i = 0; i < MAX_COUNT; i++)
{
if (i > 0) printf("+");
printf("%d", num[i]);
sum = sum + num[i];
}
printf(" = %d", sum);
}
이때 동적 메모리 할당을 이용할 수 있다.
#include <stdio.h>
#include <malloc.h>
void main()
{
int *p_num_list, count = 0, sum = 0, limit = 0, i;
printf("type maximum count of numbers : ");
scanf_s("%d", &limit);
p_num_list = (int *)malloc(sizeof(int) * limit);
while (count < limit)
{
printf("type number(9999 for quit) :");
scanf_s("%d", p_num_list + count);
if (*(p_num_list + count) == 9999) break;
count++;
}
for (i = 0; i < limit; i++) {
if (i > 0) printf("+");
printf("%d", *(p_num_list + i));
sum = sum + *(p_num_list + i);
}
printf(" = %d", sum);
}
p_num_list 포인터가 가리키는 메모리 공간의 크기를 정의할때 sizeof(...) * limit 로 정의해야 limit을 단순히 숫자의 갯수로 사용할 수 있다.