focal (3) alloca.3.gz

Provided by: manpages-pl-dev_0.7-2_all bug

NAZWA

       alloca - 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

       Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).

       ┌──────────┬────────────────────────┬─────────┐
       │InterfejsAtrybutWartość │
       ├──────────┼────────────────────────┼─────────┤
       │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).

       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 4.07 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   man   są:   Adam   Byrtek  (PTM)
       <abyrtek@priv.onet.pl>,   Andrzej   Krzysztofowicz   (PTM)    <ankry@mif.pg.gda.pl>,    Robert    Luberda
       <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.

       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ą  4.07 oryginału.