반응형
동적 메모리 할당
#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
반응형
'컴퓨터 언어 > C\C++' 카테고리의 다른 글
[c 언어] 구조체의 정의 & 배열과 포인터 구조체 만들기. (0) | 2020.04.04 |
---|---|
[c 언어] fputs 함수란. (0) | 2020.04.04 |
[c 언어] 배열에 원소 값 삽입하기 ( memmove() 이용하기 ) (0) | 2020.04.03 |
[c언어] rand(), srand() 랜덤함수는 무엇인가? (난수 생성) (0) | 2020.04.02 |
[c언어] fprintf(stderr, "error!"); 에 대하여. (0) | 2020.04.02 |