alloca

ALLOCA(3)                Podręcznik programisty Linuksa                ALLOCA(3)



NAZWA
       alloca - przydzielanie pamięci, która jest automatycznie zwalniana

SKŁADNIA
       #include <alloca.h>

       void *alloca(size_t size);

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-Safe │
       └─────────────────────────────────────┴────────────────────────┴─────────┘

ZGODNE Z
       Funkcja nie występuje w POSIX.1.

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

       The space allocated by alloca()  is not automatically deallocated if the
       pointer that refers to it simply goes out of scope.

       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 5.11 projektu Linux
       man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz
       najnowszą wersję oryginału można znaleźć pod adresem
       https://www.kernel.org/doc/man-pages/.


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 ⟨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
       manpages-pl-list@lists.sourceforge.net ⟨⟩.



GNU                             22 marca 2021 r.                       ALLOCA(3)