malloc

Autres langues

Langue: pl

Autres versions - même langue

Version: 1993-04-04 (openSuse - 09/10/07)

Section: 3 (Bibliothèques de fonctions)

NAZWA

calloc, malloc, free, realloc - przydziela i zwalnia pamiêæ dynamiczn±

SK£ADNIA


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

OPIS

calloc() przydziela pamiêæ dla tablicy zawieraj±cej nmemb elementów, ka¿dy o rozmiarze size bajtów i zwraca wska¼nik do przydzielonej pamiêci. Pamiêæ jest zerowana.

malloc() przydziela size bajtów i zwraca wska¼nik do przydzielonej pamiêci. Pamiêæ nie jest czyszczona.

free() zwalnia obszar pamiêci wskazywany przez ptr, który zosta³ wcze¶niej przydzielony za pomoc± wywo³ania malloc(), calloc() lub realloc(). W przeciwnym przypadku, lub gdy free(ptr) zosta³o ju¿ wcze¶niej wywo³ane, funkcja zachowa siê w sposób nieokre¶lony. Je¶li ptr jest równe NULL, nie zostanie wykonana ¿adna operacja.

realloc() zmienia rozmiar bloku pamiêci wskazywanego przez ptr na size bajtów. Zawarto¶æ nie zostanie zmieniona w zakresie poni¿ej minimum ze starego i nowego rozmiaru; nowo przydzielona pamiêæ nie zostanie zainicjalizowana. Je¶li ptr jest równe NULL, to wywo³anie jest równowa¿ne malloc(size); je¶li size jest równe zeru, to wywo³anie jest równowa¿ne free(ptr). O ile ptr nie jest równe NULL, musi ono byæ zwrócone przez wcze¶niejsze wywo³anie malloc(), calloc() lub realloc().

WARTO¦Æ ZWRACANA

Dla calloc() i malloc(), zwracana warto¶æ jest wska¼nikiem do przydzielonej pamiêci, który jest w³a¶ciwie wyrównany dla dowolnego rodzaju zmiennej, lub NULL gdy ¿±danie zakoñczy³o siê niepowodzeniem.

free() nie zwraca ¿adnej warto¶ci.

realloc() zwraca wska¼nik do nowoprzydzielonej pamiêci, który jest w³a¶ciwie wyrównany dla dowolnego rodzaju zmiennej i mo¿e byæ ró¿ny od ptr, lub NULL gdy ¿±danie zakoñczy siê niepowodzeniem. Je¶li rozmiar by³ równy 0, zwracane jest NULL lub wska¼nik odpowiedni do przekazania go funkcji free(). Gdy realloc() zakoñczy siê niepowodzeniem, pierwotny blok zostaje nienaruszony - nie jest on ani zwalniany ani przesuwany.

ZGODNE Z

ANSI-C

ZOBACZ TAK¯E

brk(2), posix_memalign(3)

UWAGI

Standard Unix98 wymaga, by malloc(), calloc() i realloc() przy wyst±pieniu b³êdu nadawa³y errno warto¶æ ENOMEM. Glibc zak³ada, ¿e tak siê dzieje (a wersje tych funkcji zawarte w glibc rzeczywi¶cie to robi±). Je¶li wykorzystuje siê w³asn± implementacjê malloc, która nie ustawia errno, to pewne funkcje biblioteczne mog± zawie¶æ bez przekazania przyczyny w errno.

Za³amania siê w malloc(), free() czy realloc() s± niemal zawsze zwi±zane z uszkodzeniami sterty, takimi jak przekroczenia rozmiaru przydzielonego fragmentu lub dwukrotne zwolnienie tego samego wska¼nika.

Nowe wersje linuksowej biblioteki libc (pó¼niejsze ni¿ 5.4.23) i GNU libc (2.x) zawieraj± implementacjê malloc, któr± mo¿na dostrajaæ za po¶rednictwem zmiennych ¶rodowiskowych. Przy ustawionej zmiennej MALLOC_CHECK_ stosowana jest specjalna (mniej wydajna) implementacja. Zgodnie z zamierzeniami, powinna byæ bardziej odporna na proste b³êdy, jak podwójne wywo³ania free() z tym samym argumentem czy przekroczenia o pojedynczy bajt (b³êdy off-by-one). Nie chroni jednak przed wszystkimi tego rodzaju b³êdami, w wyniku których mog± powstaæ wycieki pamiêci. Je¶li MALLOC_CHECK_ ma warto¶æ 0, jakiekolwiek wykryte uszkodzenie sterty zostanie milcz±co zignorowane; je¶li ma warto¶æ 1, na stderr wypisywany bêdzie komunikat diagnostyczny; je¶li ma warto¶æ 2, to natychmiast zostanie wywo³ane abort(). Mo¿e siê to przydaæ, gdy¿ w przeciwnym razie za³amanie siê mog³oby wyst±piæ du¿o pó¼niej, a prawdziwa przyczyna k³opotów by³aby wówczas bardzo trudna do wy¶ledzenia.

Linux stosuje optymistyczn± strategiê przydzielania pamiêci. Oznacza to, ¿e gdy malloc() zwraca warto¶æ ró¿n± od NULL, nie ma gwarancji, i¿ pamiêæ faktycznie jest dostêpna. Je¶li oka¿e siê, ¿e systemowi brak³o pamiêci, nies³awny zabójca OOM zabije jeden lub wiêcej procesów.