배열로 메모리를 요청할 경우, 싸이즈를 미리 예측해서 요청을 해야 한다. 그러나 많은 경우, 가변적으로 메모리를 요청해야 하는데, 이와 같이 동적으로 메모리를 요청하는 함수로 malloc() 과 calloc() 이 있다.


malloc()     memory allocation

헤더파일:  stdlib.h
프로토타입: void* malloc( size_t )

파라메터: 요청할 메모리의 바이트 크기   (size_t 는 보통 unsigned int )
리턴값: 메모리 요청 성공시에 그 메모리의 시작주소, 실패시 NULL

char *ptr;
ptr = malloc(6);      // 6바이트를 요청하고, 포인터를 그 시작주소에 포인팅함




---------------------------------------------------------------------------------------------------



calloc()     contiguous allocation

헤더파일:  stdlib.h
프로토타입: void* malloc( size_t , size_t )

첫번째 파라메터: 요청할 메모리 단위의 개수
두번째 파라메터: 요청할 메모리 단위의 바이트 크기

즉, 단위크기 곱하기 개수 만큼 요청함

리턴값: 메모리 요청 성공시에 그 메모리의 시작주소, 실패시 NULL

결과적으로, calloc( n , m )  은  malloc ( n * m ) 과 유사하다.
차이점은 calloc 은 요청한 메모리를 모두 0 으로 초기화 시킨다는 것이다.

자주 쓰이는 형태는

ptr = calloc( n , sizeof(double) ) ;

꼴인데, 이때, 기본데이터타입을 typedef 로 쓰면, 나중에 프로그램 수정시 용이하다. 즉,

typedef double entry;
ptr = calloc( n , sizeof(entry));

typedef 에 대해서는 나중에 자세히 설명하겠다.
------------------------------------------------------------------------------------------------------


요청한 메모리를 다시 시스템에 돌려줄때는 free() 를 사용하면 된다.

free()

헤더파일:  stdlib.h
프로토타입: void free( void* )

파라메터: 이전에 할당된 메모리의 시작주소
만약 그 포인터가 NULL 이면, 아무짓도 안한다.