Share via


_alloca

Alloue de la mémoire sur la pile.Cette fonction est déconseillée car un plus version sécurisée est disponible ; consultez _malloca.

void *_alloca( 
   size_t size 
);

Paramètres

  • [in] size
    octets à allouer de la pile.

Valeur de retour

La routine d' _alloca retourne un pointeur d' void à l'espace alloué, qui est obligatoirement aligné pour le stockage d'un type d'objet.Si size est 0, _alloca alloue un élément de longueur zéro et retourne un pointeur non valide pour cet élément.

une exception de dépassement de capacité de la pile est générée si l'espace ne peut pas être alloué.L'exception de dépassement de capacité de la pile n'est pas exception C++ ; il s'agit d'une exception structurée.Au lieu d'utiliser la gestion des exceptions C++, vous devez utiliser gestion structurée des exceptions fois SEH ().

Notes

_alloca alloue des octets d' size de la pile du programme.L'espace alloué est libéré automatiquement lorsque la sortie de la fonction d'appel (pas lorsque l'allocation passe simplement hors de portée).par conséquent, ne passez pas la valeur de pointeur retournée par _alloca comme argument à libre.

Il existe des limites à appeler explicitement _alloca dans un gestionnaire d'exceptions (EH).Les routines de EH qui s'exécutent sur des processeurs de x86-class s'exécutent dans leur propre frame de la mémoire : Elles exécutent leurs tâches dans l'espace mémoire qui n'est pas sur la position actuelle du pointeur de pile de la fonction englobante.Les implémentations les plus courantes incluent des expressions de gestion structurée (SEH) des exceptions de Windows NT et de clause catch C++.Par conséquent, appeler explicitement _alloca dans l'un des scénarios suivants provoque l'échec du programme pendant le retour à la routine d'appel des EH :

  • Windows NT fois SEH expression de filtre d'exception : __except (_alloca () )

  • Windows NT fois SEH gestionnaire d'exceptions finale : __finally {}_alloca ()

  • Expression de la clause catch de EH C++

Toutefois, _alloca peut être appelé directement d'une routine de EH ou d'un rappel fourni par l'application qui est appelé par l'un des scénarios de EH précédemment répertoriées.

Note de sécuritéNote de sécurité

Dans Windows XP, si _alloca est appelé dans un bloc try/catch, vous devez appeler _resetstkoflw dans le bloc catch.

En plus de les restrictions ci-dessus, vous utilisez l'option de/clr (Compilation du common langage runtime) , _alloca ne peut pas être utilisé dans des blocs d' __except .Pour plus d'informations, consultez restrictions de /clr.

Configuration requise

routine

en-tête requis

_alloca

<malloc.h>

Exemple

// 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);
        }
    };
}
  

Équivalent .NET Framework

Non applicable. Pour appeler la fonction C standard, utilisez PInvoke. Pour plus d'informations, consultez l' exemples d'appel de code non managé.

Voir aussi

Référence

Allocation de mémoire

calloc

malloc

realloc

_resetstkoflw

_malloca