NAZWA¶
alloca - przydzielanie pamięci, która jest automatycznie zwalniana
SKŁADNIA¶
#include <alloca.h>
void *alloca(size_t rozmiar);
OPIS¶
Funkcja
alloca() przydziela
rozmiar bajtów pamięci
na ramce stosu procedury, z której została wywołana. Ta
tymczasowa przestrzeń jest automatycznie zwalniana po powrocie funkcji,
która wywołuje
alloca() do miejsca wywołania.
WARTOŚĆ ZWRACANA¶
Funkcja
alloca() zwraca wskaźnik do początku przydzielonej
pamięci. Gdy przydzielenie pamięci spowoduje
przepełnienie stosu, zachowanie programu nie jest określone.
ATRYBUTY¶
Wielowątkowość (patrz pthreads(7))¶
Funkcja
alloca() jest wątkowo bezpieczna.
ZGODNE Z¶
Funkcja nie występuje w POSIX.1-2001.
Istnieją dowody, że funkcja
alloca()
występowała w 32V, PWB, PWB.2, 3BSD i 4BSD. W BSD 4.3 istnieje
dla niej strona podręcznika. Linux korzysta z wersji GNU.
UWAGI¶
Funkcja
alloca() zależy od maszyny i kompilatora. W przypadku
niektórych aplikacji jej użycie może poprawić
wydajność w porównaniu do użycia
malloc(3)
i
free(3). W pewnych przypadkach może także
uprościć zwalnianie pamięci w aplikacjach,
używających
longjmp(3) lub
siglongjmp(3). W
pozostałych przypadkach użycie tej funkcji nie jest zalecane.
Ponieważ przestrzeń alokowana przez
alloca() jest
przydzielana z przestrzeni stosu, to przestrzeń ta jest automatycznie
zwalniana, jeśli nastąpi przeskoczenie powrotu z funkcji przez
wywołanie
longjmp(3) lub
siglongjmp(3).
Pamięci przydzielonej przez
alloca() nie można
zwalniać za pomocą
free(3)!
Uwagi dotyczące wersji GNU¶
Zwyczajowo
gcc(1) zamienia wywołania
alloca na kod wplatany
(inlined). Nie będzie tego robił, gdy podana zostanie jedna z
opcji:
-ansi,
-std=c89,
-std=c99 lub
-std=c11 i
nie jest dołączony plik nagłówkowy
<alloca.h>. W przeciwnym wypadku (bez opcji -ansi lub -std=c*)
wersja glibc pliku
<stdlib.h> dołącza plik
<alloca.h> zawierający następujące linie:
#ifdef __GNUC__
#define alloca(size) __builtin_alloca (size)
#endif
co ma niepożądane konsekwencje, gdy ma się
własną wersję tej funkcji.
To, że kod tej funkcji jest wplatany, powoduje
niemożliwość pobrania jej adresu, jak też
niemożliwość zmiany jej zachowania poprzez
konsolidację z inną biblioteką,
Kod wplatany często składa się z pojedynczej instrukcji
modyfikującej wskaźnik stosu, lecz nie sprawdzającej jego
przepełnienia. Zatem nigdy nie jest zwracana wartość NULL
świadcząca o błędzie.
BŁĘDY¶
Nie ma żadnego powiadomienia w sytuacji, gdy nie można
powiększyć przestrzeni stosu (Jednakże po niepoprawnej
alokacji, program najprawdopodobniej otrzyma sygnał
SIGSEGV,
jeśli spróbuje uzyskać dostęp do niezaalokowanej
przestrzeni).
W wielu systemach
alloca() nie może być używana w
obrębie listy argumentów w wywołaniu funkcji, gdyż
zarezerwowana przez
alloca() przestrzeń stosu znalazłaby
się w środku przestrzeni stosu przeznaczonej na argumenty
funkcji.
ZOBACZ TAKŻE¶
brk(2),
longjmp(3),
malloc(3)
O STRONIE¶
Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux
man-pages. Opis projektu, informacje dotyczące zgłaszania
błędów, oraz najnowszą wersję
oryginału można znaleźć pod adresem
http://www.kernel.org/doc/man-pages/.
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Adam Byrtek (PTM) <abyrtek@priv.onet.pl>, Andrzej
Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, Robert Luberda
<robert@debian.org> i Michał Kułach
<michal.kulach@gmail.com>.
Polskie tłumaczenie jest częścią projektu
manpages-pl; uwagi, pomoc, zgłaszanie błędów na
stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z
wersją
3.71 oryginału.