본문 바로가기
컴퓨터 언어/C\C++

[ c 언어 ] 동적 메모리 할당 ( malloc 함수)

by SuperMemi 2020. 4. 12.
반응형

동적 메모리 할당

 

#include <stdlib.h>

void* malloc(size_t size)

 

 

프로그램을 작성 할 당시에는 얼마나 많은 공간이 필요한지 알 수도 없고,

또 사용되지 않을지도 모르는 아주 큰 공간을 미리 할 당해놓기를 원하지 않을 것이다.

 

그래서 새로운 메모리 공간이 필요할 때 마다 함수 malloc을 호출해서 필요한 양의 공간을 요구할 수 있다.

 

공간을 사용할 수 잇으면 요구한 크기의 메모리 영역에 대한 시작 주소에 대한 포인터를 반환하고, 만일 공간을 사용할 수 없으면 NULL 포인터가 반환된다.

 

나중에 메모리 영역이 더 이상 필요 없게 되면 free라는 또 다른 함수 호출을 통하여 그 영역을 시스템에 반환 할 수 있다. 이때 일단 메모리 영역이 반환되면 이것을 그 프로그램에서 다시 사용할 수 없다.

 

malloc 호출은 int나 float를 저장하는 데 필요한 저장 공간의 크기를 결정하는 매개변수를 포함한다. 결과는 적절한 크기의 메모리 영역에 대한 첫 번째 주소를 가리키는 포인터이다.

 

이제 아래의 코드를 통해 알아보자.

 

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

void main() {
	int i, * pi;
	float f, * pf;
	pi = (int*)malloc(sizeof(int));    // int크기만큼 메모리 할당.
	pf = (float*)malloc(sizeof(float));    // float크기만큼 메모리 할당.
	*pi = 1024;	
	*pf = 3.14;
	printf("an integer = %d, a float = %f\n", *pi, *pf);  // 1024, 3.14
	free(pi);    // pi에 할당된 메모리를 시스템에 반환.
	free(pf);    // pf에 할당된 메모리를 시스템에 반환.
}

 

결과.

 

 

 

malloc 에 대한 호출이 메모리 부족으로 실패할 가능성이 있기 때문에 malloc을 호출하는 코드 라인들을 다음 코드로 대체할 수 있다.

if ((pi = (int*)malloc(sizeof(int))) == NULL ||
		(pf = (float*)malloc(sizeof(float))) == NULL)
	{
		fprintf(stderr,"Insufficient memory");
		exit(EXIT_FAILURE);
	}

 

malloc을 프로그램의 여러 곳에서부터 호출 되기 때문에 malloc을 기동시키고, malloc이 실패할 때 빠져나가는 매크로를 정의하는 것이 편리할 때가 있다.

 

#define MALLOC(p,s)\
    if (!((p) = malloc(s))) {\
    	fprintf(stderr, "Insufficient memory.");\
        exit(EXIT_FAILURE);\
    }
    
// MALLOC 매크로를 사용하면 아래와 같이 간단하게 이용할 수 있다.
MALLOC(pi, sizeof(int));
MALLOC(pf, sizeof(float));

출처
c 로 쓴 자료구조론 2판/ Horowitz / 2008

반응형