alloca(3) Library Functions Manual alloca(3)

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

Standardowa biblioteka C (libc, -lc)

#include <alloca.h>
void *alloca(size_t rozmiar);

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.

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.

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

Brak.

PWB, 32V.

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.

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).

Ze względu na naturę stosu, nie da się sprawdzić, czy alokacja przepełni dostępną przestrzeń, stąd nie ma żadnego powiadomienia o błędzie (jednakże program najprawdopodobniej otrzyma sygnał SIGSEGV, jeśli spróbuje uzyskać dostęp do niedostępnej 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.

brk(2), longjmp(3), malloc(3)

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: 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 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.

2 maja 2024 r. Linux man-pages 6.8