Scroll to navigation

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

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

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.

ZOBACZ TAKŻE

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

TŁUMACZENIE

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 (niewydane)