Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przydziela pamięć na stosie. Ta funkcja jest przestarzała, ponieważ dostępna jest bezpieczniejsza wersja; zobacz _malloca.
Składnia
void *_alloca(
size_t size
);
Parametry
size
Bajty, które mają zostać przydzielone ze stosu.
Wartość zwracana
Rutyna _alloca zwraca void wskaźnik do przydzielonego miejsca, który jest odpowiednio wyrównany do magazynu dowolnego typu obiektu. Jeśli size wartość to 0, _alloca przydziela element o zerowej długości i zwraca prawidłowy wskaźnik do tego elementu.
Jeśli nie można przydzielić miejsca, zostanie wygenerowany wyjątek przepełnienia stosu. Wyjątek przepełnienia stosu nie jest wyjątkiem języka C++; jest to wyjątek ustrukturyzowany. Zamiast korzystać z obsługi wyjątków języka C++, należy użyć obsługi wyjątków strukturalnych (SEH).
Uwagi
_alloca przydziela bajty size ze stosu programu. Przydzielone miejsce jest automatycznie zwalniane, gdy funkcja wywołująca kończy działanie (a nie wtedy, gdy alokacja przechodzi jedynie poza zakres). W związku z tym nie przekazuj wartości wskaźnika zwróconej przez _alloca element jako argument do free.
Istnieją ograniczenia jawnego wywoływania _alloca w programie obsługi wyjątków (EH). Procedury EH uruchamiane na procesorach klasy x86 działają we własnej ramce pamięci: wykonują swoje zadania w przestrzeni pamięci, która nie jest oparta na bieżącej lokalizacji wskaźnika stosu otaczającej funkcji. Najbardziej typowe implementacje obejmują obsługę wyjątków strukturalnych systemu Windows (SEH) i wyrażenia klauzul catch języka C++. W związku z tym jawne wywołanie _alloca w dowolnym z następujących scenariuszy powoduje niepowodzenie programu podczas powrotu do procedury wywołującej EH:
Wyrażenie filtru wyjątku SEH systemu Windows:
__except ( _alloca() )Ostateczna procedura obsługi wyjątków SEH systemu Windows:
__finally { _alloca() }Wyrażenie klauzuli catch języka C++ EH
_alloca Można jednak wywołać bezpośrednio z poziomu procedury EH lub z wywołania zwrotnego dostarczonego przez aplikację, który jest wywoływany przez jeden z wymienionych wcześniej scenariuszy EH.
Ważne
Jeśli _alloca element jest wywoływany wewnątrz bloku try, należy wywołać _resetstkoflw metodę w bloku catch.
Oprócz powyższych ograniczeń w przypadku korzystania z /clr opcji (kompilacja środowiska uruchomieniowego języka wspólnego) nie można używać w __except blokach. _alloca Aby uzyskać więcej informacji, zobacz /clr Ograniczenia.
Wymagania
| Procedura | Wymagany nagłówek |
|---|---|
_alloca |
<malloc.h> |
Przykład
// crt_alloca.c
// This program demonstrates the use of
// _alloca and trapping any exceptions
// that may occur.
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
int main()
{
int size = 1000;
int errcode = 0;
void *pData = NULL;
// Note: Do not use try/catch for _alloca,
// use __try/__except, since _alloca throws
// Structured Exceptions, not C++ exceptions.
__try {
// An unbounded _alloca can easily result in a
// stack overflow.
// Checking for a size < 1024 bytes is recommended.
if (size > 0 && size < 1024)
{
pData = _alloca( size );
printf_s( "Allocated %d bytes of stack at 0x%p",
size, pData);
}
else
{
printf_s("Tried to allocate too many bytes.\n");
}
}
// If an exception occurred with the _alloca function
__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
{
printf_s("_alloca failed!\n");
// If the stack overflows, use this function to restore.
errcode = _resetstkoflw();
if (errcode == 0) // _resetstkoflw() returns 0 on failure
{
printf_s("Could not reset the stack!\n");
_exit(1);
}
};
}
Allocated 1000 bytes of stack at 0x0012FB50
Zobacz też
Alokacja pamięci
calloc
malloc
realloc
_resetstkoflw
_malloca