[C언어] 동적 메모리 할당 malloc() , calloc() , 해제 free()
COM2008. 2. 6. 11:30 |배열로 메모리를 요청할 경우, 싸이즈를 미리 예측해서 요청을 해야 한다. 그러나 많은 경우, 가변적으로 메모리를 요청해야 하는데, 이와 같이 동적으로 메모리를 요청하는 함수로 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 이면, 아무짓도 안한다.