_alloca
div
EOF
TOC
Collapse the table of content
Expand the table of content
Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

_alloca

Asigna memoria en la pila. Se deja de utilizar esta función porque una versión más segura está disponible; vea _malloca.

void *_alloca( 
   size_t size 
);

[in] size

Bytes que se afectarán asignado de la pila.

La rutina de _alloca devuelve un puntero de void el espacio asignado, que se garantiza que sea sencilla alineadas para el almacenamiento de cualquier tipo de objeto. Si size es 0, _alloca asigna un elemento de longitud cero y devuelve un puntero válido a ese elemento.

Se genera una excepción de desbordamiento de pila si el espacio no puede estar asignado. La excepción de desbordamiento de pila no es excepción de C++.; es una excepción estructurada. En lugar de utilizar el control de excepciones de C++, debe utilizar control de excepciones estructurado (SEH).

_alloca asigna los bytes de size de la pila del programa. El espacio asignado automáticamente se libera cuando finaliza la función de llamada (no cuando la asignación pasa simplemente fuera de ámbito). Por consiguiente, no pase el valor devuelto del puntero en _alloca como argumento a libre.

Hay restricciones explícitamente a _alloca en un controlador de excepciones (EH). Las rutinas de EH que se ejecutan en procesadores de x86-class funcionan en su propio cuadro de memoria: Realizan las tareas en el espacio de memoria que no se basa en la ubicación actual del puntero de pila de la función envolvente. Las implementaciones más comunes incluyen expresiones de control de excepciones (SEH) estructurado de windows NT y la cláusula catch de C++. Por consiguiente, llamar explícitamente _alloca en escenarios de cualquiera de las siguientes da lugar a errores de programa durante el retorno a la rutina de EH de nomenclatura:

  • Expresión de filtro de excepciones de Windows NT SEH: __except (_alloca () )

  • Controlador de excepciones final de Windows NT SEH: __finally {_alloca () }

  • expresión de la cláusula catch de C++ EH

Sin embargo, _alloca se puede llamar directamente dentro de una rutina de EH o de una devolución aplicación-proporcionado que obtenga invocado por uno de los escenarios de EH enumeradas anteriormente.

Nota de seguridad Nota sobre la seguridad

En Windows XP, si _alloca se denomina dentro de un bloque try/catch, debe llamar a _resetstkoflw en el bloque catch.

Además de las restricciones anteriores, cuando se utiliza la opción de/clr (Compilación de Common Language Runtime) , _alloca no se puede usar en los bloques de __except . Para obtener más información, vea /clr Restricciones.

rutina

Encabezado necesario

_alloca

<malloc.h>

// 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);
        }
    };
}
Asignado 1000 bytes de la pila en 0x0012FB50

No es aplicable Para llamar a la función estándar de C, utilice PInvoke. Para obtener más información, vea La invocación de plataforma ejemplos.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2016 Microsoft