프로그래밍 언어/c

C언어 동적메모리

안나Anna 2021. 1. 20. 02:57

C언어 동적메모리

동적메모리할당이란 프로그램이 실행 도중에 동적으로 메모리를 할당받는 것이다.
필요한 만큼의 메모리를 시스템으로부터 할당받아서 사용하고, 사용이 끝나면 시스템에 메모리를  반납한다. 필요할 때 사용하고 반납하기 때문에 메모리를 매우 효율적으로 사용할 수 있다. 
동적 메모리는 malloc()계열의 라이브러리 함수를 사용하여 할당받을 수 있다. 프로그램이 수행되다가 malloc()함수를 만나면 운영체제가 호출되어서 필요한 만큼의 동적 메모리를 할당하게 된다.

 

1. 동적 메모리 할당


malloc()함수는 요청된 크기만큼의 메모리 공간을 찾아서 메모리의 주소를 반환한다.
단위는 바이트이다.(malloc(100)은 100바이트 공간을 요청하는 것)

요청한 메모리 공간을 할당할 수 없는 경우에는 NULL값 반환한다. 

여기서 반환하는 것은 void를 가리키는 포인터이다. 

void 포인터를 반환하는 것은 프로그래머가 메모리 공간을 어떤 자료형으로 사용할지 알 수 없기 때문이다. 

void 포인터는 다른 자료형의 포인터로 변경이 가능하다.  

따라서 프로그래머는 자신이 사용하고자 하는 자료형의 포인터로 형변환하여 사용해야 한다.

 

 

2. 동적 메모리 사용


동적 메모리 공간은 이름이 없어, 오직 포인터를 사용하여 사용할 수 있다. 

 

 

3. 동적 메모리 반납


free()는 동적으로 할당되었던 메모리 블록을 시스템에 반납한다. 

컴퓨터 시스템에서 동적으로 할당 가능한 메모리는 제한되어 있다. 따라서 할당받은 메모리의 사용이 끝났을 경우에는 반드시 메모리를 다른 프로그램이 사용할 수 있도록 반납하여야한다. 
(free()는 호출할 때는 할당된 메모리를 가리키는 포인터를 인수로 하여 호출하여야 한다.)

 

동적 메모리 할당의 가장 큰 장점은 사용자가 원하는 크기의 배열을 만들 수 있다는 점이라 사용자가 입력하는 크기의 배열을 만드는 예제를 실습해보았다. 

사용자에게 원하는  항목의 개수를 물어보고 그 크기의 배열을 동적으로 생성하여 배열에 사용자가 입력하는 데이터를 저장하고 다시 출력해보았다.

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

int main(void)
{
	int *p;
	int i, items;

	printf("항목의 개수는 몇개입니까? ");
	scanf("%d", &items);
	p = (int*)malloc(sizeof(int)*items);

	for (i = 0; i < items; i++) {
		printf("항목(정수)을 입력하시오: ");
		scanf("%d", &p[i]);
	}

	printf("\n입력된 값은 다음과 같습니다: \n");
	for (i = 0; i < items; i++)
		printf("%d ", p[i]);
	printf("\n");
	free(p);

	return 0;
}