Sdílet prostřednictvím


_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í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.

Viz také

Referenční dokumentace

Přidělení paměti

calloc

MALLOC

realloc

_resetstkoflw

_malloca