malloc

Autres langues

Langue: ko

Version: 1993년 4월 4일 (fedora - 25/11/07)

Section: 3 (Bibliothèques de fonctions)

이름

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

사용법

 #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);
 

설명

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

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

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

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

반환값

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

free() 는 어떤 값도 반환하지 않는다.

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

호환

ANSI-C

관련 항목

brk(2)

주의

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() 가 즉시 호출된다. 이것은 유용하다. 왜냐하면 크래쉬가 나중에 생길것이고 문제의 원인을 찾아가는것이 매우 어려워지기 때문이다.

역자

정강훈 <skyeyes@soback.kornet.net>, 2001년 3월 11일