Scroll to navigation

MALLOC(3) 리눅스 프로그래머 매뉴얼 MALLOC(3)

이름

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일
한글 Manpage 프로젝트 (http://man.kldp.org) 2005년 2월 15일

1993년 4월 4일 GNU