alloca(3)

NAZWA
alloca - przydziela pamięć, która jest automatycznie zwalniana

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

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
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
Interfejs | Atrybut | Wartość
alloca() | Bezpieczeństwo wątkowe | MT-bezpieczne

STANDARDY
Brak.

HISTORIA
PWB, 32V.

UWAGI
Funkcja alloca() zależy od maszyny i kompilatora. Alokacja zachodzi ze stosu, dlatego jest szybsza niż 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).

Przestrzeń zaalokowana przez alloca() nie jest automatycznie dealokowana, jeśli wskaźnik, który się do niej odnosi, wychodzi poza zakres; jest automatycznie dealokowana, gdy funkcja wywołująca powraca.

Pamięci przydzielonej przez alloca() nie można zwalniać za pomocą free(3)!

Z konieczności alloca() jest funkcją wbudowaną kompilatora, znaną również jako __builtin_alloca(). Domyślnie, współczesne kompilatory automatycznie tłumaczą wszystkie wystąpienia alloca() na wbudowaną, lecz jest to niedopuszczalne, jeśli zażądano zgodności ze standardami (-ansi, -std=c*). W takim przypadku wymagane jest <alloca.h>, aby wyemitowana była zależność symboliczna.

To, że alloca() jest wbudowana, powoduje niemożliwość pobrania jej adresu, jak też niemożliwość zmiany jej zachowania poprzez konsolidację z inną biblioteką,

Tablice o zmiennym rozmiarze (ang. variable length array — VLA) są częścią standardu C99, opcjonalną od C11, i mogą służyć podobnym celom. Nie portują się jednak do standardu C++ i, będąc zmiennymi, istnieją w swoim zasięgu blokowym i nie posiadają interfejsu przypominającego alokator, co czyni je nieodpowiednimi do implementowania funkcjonalności takich jak strdupa(3).

USTERKI
alloca() nie odpytuje systemu o dostępną pamięć stosu i nie korzysta z kopca, gdy brak dostępnej pamięci stosu. Z tego powodu nie może wskazać błędu, jeśli alokacja się nie powiedzie. Jeśli alokacja się nie powiedzie, program prawdopodobnie otrzyma sygnał SIGSEGV.

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)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Adam Byrtek <alpha@irc.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.