alloca(3) 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.

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) <[email protected]>, Andrzej Krzysztofowicz (PTM) <[email protected]>, Robert Luberda <[email protected]> i Michał Kułach <[email protected]>.

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.