[C] 동적메모리 사용하기

2021. 1. 10. 17:37프로그래밍 공부/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을 단순히 숫자의 갯수로 사용할 수 있다.