다음을 통해 공유


_alloca

스택에 메모리를 할당합니다.더 안전한 버전을 사용할 수 있으므로이 함수는 사용 되지 않습니다. see _malloca.

void *_alloca( 
   size_t size 
);

매개 변수

  • [in] size
    스택에 할당할 바이트 수입니다.

반환 값

_alloca 루틴 반환은 void 저장소의 모든 종류의 개체에 대 한 적절 한 정렬 되어야 보장 됩니다 할당 된 공간에 대 한 포인터입니다.경우 size 0으로, _alloca 빈 항목을 할당 하 고 해당 항목에 대 한 유효한 포인터를 반환 합니다.

공간을 할당할 수 없는 경우 스택 오버플로 예외가 발생 합니다.스택 오버플로 예외는 C++ 예외가 아닙니다. 이 구조적된 예외입니다.C + + 예외 처리를 사용 하는 대신 사용 해야 합니다 구조적 예외 처리 (SEH).

설명

_alloca할당 size 프로그램 스택에서 바이트 수입니다.(할당 단순히 범위 밖에 전달 하지 때) 호출 하는 함수를 종료할 때 할당 된 공간이 자동으로 비워집니다.따라서 반환 된 포인터 값을 전달 하지 않습니다 _alloca사용할 수 있는.

제한을 명시적으로 호출 하는 _alloca 에서 예외 처리기 (EH).X에서 실행 되는 EH 루틴 86 클래스 프로세서는 자체 메모리 프레임에서 작동: 바깥쪽 함수의 스택 포인터의 현재 위치를 기반으로 하지 않는 메모리 공간에서 작업을 수행 합니다.가장 일반적인 구현 Windows NT 구조적 예외 (SEH) 처리 및 C++ catch 절 식이 포함 됩니다.따라서 명시적으로 호출 _alloca 에 다음과 같은 시나리오 결과를 프로그램 호출 EH 루틴에 반환을 동안 오류가 발생 했습니다.

  • Windows NT SEH 예외 필터 식: __except (_alloca () )

  • Windows NT SEH 마지막 예외 처리기: __finally {_alloca () }

  • C + + EH catch 절 식

그러나, _alloca 에서 직접 EH 루틴 내에서 호출 되는 응용 프로그램 제공 콜백 이전의 EH 시나리오 중 하나에서 호출 될 수 있습니다.

보안 정보보안 정보

Windows XP의 경우 _alloca 라고 try/catch 블록 내에서 호출 해야 _resetstkoflw catch 블록에 있습니다.

위의 제한을 사용 하는 경우에/clr (공용 언어 런타임 컴파일) 옵션을 _alloca 에서 사용할 수 없습니다 __except 블록입니다.자세한 내용은 /clr 제한.

요구 사항

루틴

필수 헤더

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

해당 .NET Framework 항목

해당 사항 없음. 표준 C 함수를 호출할 수 있습니다 PInvoke. 자세한 내용은 플랫폼 호출 예제.

참고 항목

참조

메모리 할당

calloc

malloc

realloc

_resetstkoflw

_malloca