_alloca
Přidělí paměť v zásobníku.Tato funkce se již nepoužívá, protože je bezpečnější verze k dispozici; see _malloca.
void *_alloca(
size_t size
);
Parametry
- [v]size
Počet bajtů přiřazen ze zásobníku.
Vrácená hodnota
_alloca Rutinní vrátí void ukazatel na přidělený prostor, je zaručena vhodně zarovnání pro skladování jakýkoli typ objektu.Pokud size 0, _alloca přiděluje položce nulové délky a vrátí platný ukazatel na tuto položku.
Výjimkou přetečení zásobníku je generována, pokud nelze přidělit prostor.Výjimky přetečení zásobníku není C++ výjimku; je strukturované výjimky.Namísto použití C++ zpracování výjimek, je nutné použít Strukturované zpracování výjimek (SEH).
Poznámky
_allocapřidělí size bajtů ze zásobníku program.Přidělené místo automaticky uvolněno při volání funkce ukončí (při přidělování předává pouze mimo rozsah).Proto neprojde ukazatel hodnotu vrácenou _alloca jako argument bez.
Existují omezení explicitně voláním _alloca v popisovač výjimky (EH).EH rutiny na x 86 třída procesory pracují v rámci své vlastní paměti: vykonávají své úkoly v paměťovém prostoru, který není založen na aktuální umístění ukazatel na zásobník ohraničujícím funkce.Nejběžnější implementace patří strukturovaného systému Windows NT výjimky (SEH) zpracování a výrazů klauzule catch C++.Proto explicitně voláním _alloca v libovolné z následujících scénářů výsledků selhání programu při návratu k volání rutiny EH:
Výraz filtru Windows NT S výjimkou: __except (_alloca () )
Popisovač konečné výjimky S Windows NT: __finally {_alloca () }
Výraz klauzule catch C++ EH
Však _alloca lze volat přímo z proceduru EH nebo z zpětné určený aplikací, která získá vyvolána jednou z dříve uvedených scénářů EH.
Poznámka k zabezpečení |
---|
V systému Windows XP Pokud _alloca se nazývá uvnitř bloku try/catch musí volat _resetstkoflw v bloku catch. |
Vedle výše uvedených omezení při použití/clr (kompilace společné Language Runtime) možnost, _alloca nelze použít v __except bloky.Další informace naleznete v /clr omezení.
Požadavky
Rutina |
Požadované záhlaví |
---|---|
_alloca |
<malloc.h> |
Příklad
// 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 occured 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)
{
printf_s("Could not reset the stack!\n");
_exit(1);
}
};
}
Ekvivalent v rozhraní .NET Framework
Nelze použít Použijte volání funkce standardní C, PInvoke. Další informace naleznete v tématu Příklady vyvolat platformu.