반응형

malloc 함수를 설명하기 전에 변수가 저장되는 메모리 공간의 종류들에 대해 설명을 먼저 해보고자 합니다.

 

메모리 공간은 여러 가지가 있지만 대표적으로 전역변수가 저장되는 Data영역 , 지역변수가 저장되는 Stack영역. 그리고 메모리의 은행 창고의 역할을 하는 Heap영역이 있습니다. 이 글에서 쓰는 동적 메모리란 사용자가 메모리를 자유자재로 할당받는다는 것을 의미합니다. 즉, Heap영역으로부터 메모리를 필요한만큼 빌려쓰고 반환을 합니다.

이게 참 좋은게 배열을 다룰 때입니다.

예를 들어서, 대학교에서 어떤 강의의 수강생에 대한 재수강 여부를 관리하고자 합니다. 여러분들도 아시다시피 중간에 수강철회하는 사람, 새로 수강신청을 한 사람들이 있습니다. 즉, 상황에 따라 유동적으로 바뀝니다.

대략 이 강의를 50명 정도가 듣는다 치고  배열을 [50]으로 잡았는데, 생각보다 많은 사람이 빠져나가서 할당한 메모리가 남게 되었습니다.

즉, 메모리를 쓸데없이 많이 쓰고 있는 상태이므로 이러한 프로그램은 상당히 비효율적입니다.

이를 위해 상황에 따라 유동적으로 메모리를 할당하겠다. 하는게 C언어에서는 '동적 메모리 할당 malloc함수' 입니다.

 

그럼 이를 활용한 간단한 소스코드를 보면서 설명하겠습니다.

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

int main()
{
	int i,count; // 학생 수 , 점수  
	int sum = 0;
	
	printf("학생 몇명임? : "); 
	scanf("%d",&count);
	int *student = malloc(sizeof(int)*count);
	if (student == NULL)
	{
		printf("Fail to Allocation.\n");
		exit(1);
	} 
	
	for (i=0; i<count; i++)
	{
		printf("[%d/%d] score? : ",i+1,count);
		scanf("%d",&student[i]);
		sum += student[i];
	}
	
	for (i=0; i<count; i++)
	{
		printf("[%d/%d] Score : %d\n",i+1,count,student[i]);
	}
	
	printf("%d",sum/i);
	
	
	free(student);
	return 0;
}

1. 제일 먼저 동적메모리 함수를 사용하기 위해선 stdlib.h 헤더파일을 선언해야 합니다.

2. 이제 눈여겨 봐야할 점.  malloc과 free입니다.

이 둘은 항상 같이 다니는 세트입니다. malloc : 메모리 빌려줘!  free : 메모리 갚어!

int *student = malloc(sizeof(int)*count);

이 코드의 의미를 보겠습니다. malloc을 통해서 int (4Byte) 자료형 크기의 메모리를 받을건데 그건 count 수만큼 합산해서 빌려줘! 이겁니다. 즉, count = 5면  20Byte를 빌리겠다는거겠죠?

 

포인터변수 student가 할당받은 메모리 공간의 주소를 가리키고 있습니다. 

 

3. if (student == NULL) 은 만약 할당받은 메모리 공간이 없다면 아래 몸체에 Fail to Allocation을 출력하여 뭔가 오작동되었음을 알립니다.

 

4. 이제 할당받은 student들의 점수를 채워넣도록 하겠습니다. 20Byte 크기의 공간을 빌렸으니 5명의 점수를 입력받습니다.

 

5. 프로그램 종료 시 사용한 20Byte를 반환하기 위해 free(student)를 해주었습니다. 이를 안할 시, 메모리 누수가 되어 지뢰찾기 하는데 메모리를 오지게 사용하게 되는 꼴이 됩니다.

 

이를 통해서 우리는 메모리를 필요한만큼만 사용해서 보다 효율적으로 관리를 하는게 가능해졌습니다.

아래는 동적메모리할당을 활용한 간단한 성적 관리 프로그램입니다.

 

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

int main()
{
	int i,count; // 학생 수 , 점수  
	int sum = 0;
	
	printf("학생 몇명임? : "); 
	scanf("%d",&count);
	int *student = malloc(sizeof(int)*count);
	if (student == NULL)
	{
		printf("Fail to Allocation.\n");
		exit(1);
	} 
	
	for (i=0; i<count; i++)
	{
		printf("[%d/%d] score? : ",i+1,count);
		scanf("%d",&student[i]);
		if (student[i] > 100 || student[i] < 0)
		{
			printf("wrong!\n");
			return;
		 } 
		sum += student[i];
	}
	
	int average = sum/i;
	printf("\n\n");
	
	
	printf("평균 점수는 : %d\n",average);
	
	for (i=0; i<count; i++)
	{
		if (student[i]<average)
		{
			printf("[%d] 평균 아래입니다.재수강하세요. \n",i+1);	
		}
		
		else if (student[i]>=average)
		{
			printf("[%d ]PASS.\n",i+1);
		}
	} 
	
	
	free(student);
	return 0;
}
반응형

+ Recent posts