2009. 3. 31. 13:29


NAME


       calloc, malloc, free, realloc - 동적 메모리 할당 및 해제


SYNOPSYS


 #include <stdlib.h>

 void *calloc(size_t nmemb, size_t size);
 void *malloc(size_t size);
 void free(void *ptr);
 void *realloc(void *ptr, size_t size);



DESCRIPTION


 calloc()  함수는 원소의 크기가 size 바이트인 nmemb 개의 원소로 이루어진 배열을 위한 메모리를 할당하고
 할당된 메모리에 대한포인터를 반환한다.  메모리는 0 으로 설정된다.

 malloc() 함수는 size 바이트를 할당하고 할당된 메모리에 대한 포인터를 할당한다.  메모리를 클리어하지 않는다.

 free() 는 malloc(), calloc() 또는 realloc() 에 대한 호출시 반환되는 ptr 이 가리키는 메모리 공간을 해제한다.
 그렇지 않고, 만일 free(ptr) 가  전에 이미 호출되었다면, 정의되지 않은 행동이 일어난다. 
 만일 ptr 이 NULL 이라면, 어떤 작동도 행해지지 않는다.

 realloc() 함수는 ptr 이 가리키는 메모리 블럭의 크기를 size 바이트로 바꾼다.
 내용은 예전의 최소 크기에서 새 크기로 바뀌지 않는다. 새롭게 할당된 메모리는 초기화되지 않는다. 
 만일 ptr 이 NULL 이라면, 호출은 malloc(size) 과 동일하다; 만일 크기가 0 이라면, 호출은 free(ptr) 와 동일하다.  
 만약 ptr 이 NULL 이 아니라면, 이 함수는 malloc(), calloc() 이나 realloc() 에 대한 초기 호출시 반환되어야 한다.


RETURN VALUE


 calloc() 그리고 malloc()함수에서, 반환 값은 할당된 메모리를 가리키며, 이것은 어떤 종류의 변수를위해 적당히 정렬된다.
 만일 요구가 실패하면, NULL 이반환된다.
 
 free() 는 어떤 값도 반환하지 않는다.

 realloc() 은 새로 할당된 메모리를 가리키는 포인터를 반환하며 이 메모리는 어떤 종류의변수를 위해 적당히 정렬되며 ptr과는
 다를 것이다. 그렇지  않고, 만일 요구가 실패하거나 크기가 0 이라면 NULL 을 반환한다. 
 만일 realloc() 이 실패한다면 원래 블럭은 건드리지 않고 남아있다 -- 해제되거나 이동되지않는다.


CONFORMING TO


       ANSI-C


NOTES


 Unix98 표준은 실패시 errno 를 ENOMEM으로 설정하도록 malloc(), calloc(), 그리고 realloc() 을 요구한다.  Glibc는 이렇게  설정된 것으로 생각된다. ( 그리고 이 루틴들의 glibc 버전은 이것을 한다); 만일 여러분이 errno를설정하지 않는 개인적인  malloc 수행을 사용한다면, 라이브러리 루틴들은 errno를가지는 것 없이 이유없이 실패할 것이다.

 malloc(), free() 또는 realloc() 함수에서 크래쉬는 할당된 영역의 오버 플로우나 같은 포인터를 두번 해제 하는 것과같은 
 힙 오염과 항상 관련이 있다.

 Linux libc (5.4.23 이후)의 최근 버전과 GNU libc (2.x) 버전은 환경 변수를 통해조정할수 있는 malloc 수행을 포함한다.  
 MALLOC_CHECK_ 이 설정되었다면, 특별한 (덜 효율적이지만) 행동이 행해지며, 이것은 같은 인자를 가지고 free() 를 두번 호
 출하거나 단일 바이트(off-by-one 버그)의 초과 같은 간단한 에러에 대한안전을 위해 디자인되었다. 
 그러나 그런 에러들은 항상 보호되지는 않으며 메모리 누수가 생길 수 있다.  만일 MALLOC_CHECK_ 을 0 으로 설정하 면,
 발견된 힙 오염은 무시된다; 만일 1 로 설정하면, 진단은 stderr로 출력된다; 만일 2 로 설정하면, abort() 가 즉시 호출된다. 이것
 은 유용하다. 왜냐하면 크래쉬가 나중에 생길것이고문제의 원인을 찾아가는것이 매우 어려워지기 때문이다.


SEE ALSO


       brk(2)

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

atexit(3)  (0) 2009.04.01
memset(3)  (0) 2009.04.01
strcpy(3)  (0) 2009.03.31
getenv(3)  (1) 2009.03.30
fclose(3)  (0) 2009.03.29
Posted by devanix