소프트웨어/C 언어

[C언어]35.포인터의 첫번째 응용 동적할당 -2- (동적할당 하는 법, malloc, free)

리습 2021. 3. 14. 18:00

안녕하십니까. 리습입니다.

오늘은 동적 할당의 방법에 대하여 알아보도록 하겠습니다.

C언어에서 동적 할당을 하기 위해서는 다음 헤더파일과 두 함수만 기억을 하고 있으면 됩니다.

#include <stdlib.h>

void *malloc(size_t size); // 할당을 위한 함수
void free(void *memblock); // 해제를 위한 함수

stdlib.h 헤더파일은 동적할당을 사용하기 위해서 꼭 선언을 해야하는 헤더파일입니다. 이 외에도 malloc.h 파일을 선언해도 사용이 가능합니다.

malloc 함수는 OS에게 메모리 공간을 요청하고, 이 위치를 반환받는 함수입니다. 메모리의 주소는 void pointer의 형식으로 전달됩니다.

여기서 잠깐 void pointer에 대해서 잠시 설명드리면, type이 정해져 있지 않는 특수한 pointer입니다. 

동적할당에서 나오는 특수한 pointer :  void pointer

 이전에 저희가 알고 있는 pointer들은 보통 int*, char* 등 변수의 타입과 유사한 형태를 가지고 있는데요, void pointer의 경우 변수의 type을 지정하지 않고 메모리 주소 만을 저장하고 싶을 때 많이 사용합니다. 따라서 다양한 형식의 pointer를 전달해야 되는 함수 특성상, 특정한 형식의 pointer변수를 넘겨주는 것보다는 메모리 주소만을 의미하는 void pointer로 전달해주게 되는 것이죠. 

 따라서 이 포인터를 실질적으로 사용해 주기 위해선 우리가 일반적으로 사용하는 변수 타입과 유사한 형태의 pointer로 형변환(Casting)을 해주어야 합니다. 

자 그럼 동적 할당 사용 방법을 알아보도록 하겠습니다.

동적 할당하는 방법! 

int *ptr = NULL;
ptr = (int*)malloc(sizeof(int) * 10); // 필요한 숫자 입력
/* processing */
free(ptr);

 동적할당은 다음과 같이 사용할 수 있습니다. 위 코드에서 int *ptr = NULL은 할당받을 위치를 저장할 pointer이며, 할당에 필요한 변수 type으로 사용하시면 됩니다.  실제 할당이 이루어지는 코드 위치는 두 번째 줄입니다. ptr변수에 OS로부터 할당받은 메모리의 주소를 받는 것인데요, malloc함수의 입력 값으로 필요한 메모리 크기의 Byte값을 입력해야 합니다. 따라서 4Byte 크기의 int변수를 10개 사용할 것이기 때문에, sizeof() 함수로 int변수의 크기를 받은 후 이를 필요한 개수만큼 곱해주는 방법으로 필요한 메모리 공간을 계산하여 요청하는 것입니다. 물론 변수 공간을 직접 계산하여 40과 같은 값으로 입력해줄 수 있지만, 실제 int변수 타입의 사이즈가 개발환경에 따라 완벽히 동일하다는 것을 전제할 수 없기 때문에 위와 같은 방식으로 사용하시는 걸 권유드립니다.

 변수 공간을 모두 사용한 이후에는 반드시 free로 메모리 공간을 해제해주어야 합니다. 응용프로그램에서 메모리 공간을 해제해주지 않는다면, OS는 그 메모리 공간이 계속 사용되는 공간으로 간주하여 그 공간을 낭비하게 됩니다. 그렇게 되면 시간이 흐를수록 OS가 사용할 수 있는 가용 메모리 공간이 줄어들게 될 것이고, 이는 전제적인 시스템 성능 저하와 메모리 공간 부족 문제를 발생시키게 될 것입니다. 이를 메모리 누수(Memory leakage)라고 하며 C개발자라면 꼭 피해야 하는 심각한 버그입니다. 

 자 이렇게 메모리 할당에 대해서 알아보았습니다. 메모리 할당은 프로그램이 메모리를 필요할 때마다 불러 사용할 수 있기 때문에 매우 편리한 기능이기도 하지만, 반면에 잘못 사용하게 되면 메모리 누수라는 심각한 버그를 만들 수 있는 양날의 검입니다. 따라서 이 기능에 대해 정확히 이해를 하시고 사용하시기 바랍니다.

마무리

 메모리 사용 중에는 간혹 메모리 사이즈를 줄이거나 다시 늘려야 할 필요가 있을 수도 있습니다. 다음 편에는 이를 위한 재할당 방법을 알아보도록 하겠습니다.