_alloca_alloca

스택에 메모리를 할당합니다.Allocates memory on the stack. 더 안전한 버전을 사용할 수 있으므로이 함수는 더 이상 사용 되지 않습니다. _malloca를 참조 하세요.This function is deprecated because a more secure version is available; see _malloca.

구문Syntax

void *_alloca(
   size_t size
);

매개 변수Parameters

sizesize
스택에서 할당할 바이트입니다.Bytes to be allocated from the stack.

Return ValueReturn Value

_Alloca 루틴은 할당 된 void 공간에 대 한 포인터를 반환 합니다 .이는 모든 형식의 개체 저장소에 적절 하 게 정렬 됩니다.The _alloca routine returns a void pointer to the allocated space, which is guaranteed to be suitably aligned for storage of any type of object. Size 가 0 인 경우 _alloca 길이가 0 인 항목을 할당 하 고 해당 항목에 대 한 유효한 포인터를 반환 합니다.If size is 0, _alloca allocates a zero-length item and returns a valid pointer to that item.

공간을 할당할 수 없는 경우 스택 오버플로 예외가 생성됩니다.A stack overflow exception is generated if the space cannot be allocated. 스택 오버플로 예외는 C++ 예외가 아니며 구조적 예외입니다.The stack overflow exception is not a C++ exception; it is a structured exception. C++ 예외 처리를 사용하는 대신 SEH(구조적 예외 처리)를 사용해야 합니다.Instead of using C++ exception handling, you must use Structured Exception Handling (SEH).

설명Remarks

_alloca 는 프로그램 스택에서 크기 바이트를 할당 합니다._alloca allocates size bytes from the program stack. 할당 된 공간은 호출 함수가 종료 될 때 자동으로 해제 됩니다 (할당이 범위를 벗어나는 경우에만).The allocated space is automatically freed when the calling function exits (not when the allocation merely passes out of scope). 따라서 _alloca 에서 반환 된 포인터 값을 free의 인수로 전달 하지 마십시오.Therefore, do not pass the pointer value returned by _alloca as an argument to free.

EH (예외 처리기)에서 _alloca 를 명시적으로 호출 하는 데 제한 사항이 있습니다.There are restrictions to explicitly calling _alloca in an exception handler (EH). x86급 프로세서에서 실행되는 EH 루틴은 고유한 메모리 프레임에서 작동합니다. 즉, 바깥쪽 함수 스택 포인터의 현재 위치를 기반으로 하지 않는 메모리 공간에서 해당 작업을 수행합니다.EH routines that run on x86-class processors operate in their own memory frame: They perform their tasks in memory space that is not based on the current location of the stack pointer of the enclosing function. 가장 일반적인 구현에는 Windows NT SEH(구조적 예외 처리) 및 C++ catch 절 식이 포함됩니다.The most common implementations include Windows NT structured exception handling (SEH) and C++ catch clause expressions. 따라서 다음 시나리오 중 하나에서 명시적으로 _alloca 를 호출 하면 호출 EH 루틴으로 돌아가는 동안 프로그램 오류가 발생 합니다.Therefore, explicitly calling _alloca in any of the following scenarios results in program failure during the return to the calling EH routine:

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

  • Windows NT SEH 최종 예외 처리기:__finally { _alloca() }Windows NT SEH final exception handler: __finally { _alloca() }

  • C++ EH catch 절 식C++ EH catch clause expression

그러나 EH 루틴 내에서 직접 또는 이전에 나열 된 EH 시나리오 중 하나에서 호출 된 응용 프로그램 제공 콜백에서 직접 _alloca 를 호출할 수 있습니다.However, _alloca can be called directly from within an EH routine or from an application-supplied callback that gets invoked by one of the EH scenarios previously listed.

중요

Windows XP에서 try/catch 블록 내에서 _alloca 를 호출 하는 경우 catch 블록에서 _resetstkoflw 를 호출 해야 합니다.In Windows XP, if _alloca is called inside a try/catch block, you must call _resetstkoflw in the catch block.

위의 제한 사항 외에/clr (공용 언어 런타임 컴파일) 옵션을 사용 하는 경우 _alloca 블록에서 사용할 수 없습니다 __except .In addition to the above restrictions, when using the/clr (Common Language Runtime Compilation) option, _alloca cannot be used in __except blocks. 자세한 내용은 /clr Restrictions을 참조하십시오.For more information, see /clr Restrictions.

요구 사항Requirements

루틴에서 반환된 값Routine 필수 헤더Required header
_alloca_alloca <malloc.h>

예제Example

// 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 occurred 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);
        }
    };
}
Allocated 1000 bytes of stack at 0x0012FB50

참고 항목See also

메모리 할당Memory Allocation
calloccalloc
mallocmalloc
reallocrealloc
_resetstkoflw_resetstkoflw
_malloca_malloca