_malloca_malloca

스택에 메모리를 할당합니다.Allocates memory on the stack. CRT의 보안 기능에 설명된 대로 강화된 보안 기능이 있는 _alloca 버전입니다.This is a version of _alloca with security enhancements as described in Security Features in the CRT.

구문Syntax

void *_malloca(
   size_t size
);

매개 변수Parameters

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

반환 값Return Value

_Malloca 루틴은 할당 된 void 공간에 대 한 포인터를 반환 합니다 .이는 모든 형식의 개체 저장소에 적절 하 게 정렬 됩니다.The _malloca 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 인 경우 _malloca 길이가 0 인 항목을 할당 하 고 해당 항목에 대 한 유효한 포인터를 반환 합니다.If size is 0, _malloca allocates a zero-length item and returns a valid pointer to that item.

Size_ALLOCA_S_THRESHOLD보다 큰 경우 _malloca 힙에서 할당 하려고 시도 하 고 공간을 할당할 수 없는 경우 null 포인터를 반환 합니다.If size is greater than _ALLOCA_S_THRESHOLD, then _malloca attempts to allocate on the heap, and returns a null pointer if the space can't be allocated. Size_ALLOCA_S_THRESHOLD보다 작거나 같은 경우 _malloca 스택에서를 할당 하려고 시도 하 고 공간을 할당할 수 없는 경우 스택 오버플로 예외가 발생 합니다.If size is less than or equal to _ALLOCA_S_THRESHOLD, then _malloca attempts to allocate on the stack, and a stack overflow exception is generated if the space can't be allocated. 스택 오버플로 예외는 c + + 예외가 아닙니다. 구조적 예외입니다.The stack overflow exception isn't a C++ exception; it's a structured exception. C + + 예외 처리를 사용 하는 대신, SEH ( 구조적 예외 처리 )를 사용 하 여이 예외를 catch 해야 합니다.Instead of using C++ exception handling, you must use Structured Exception Handling (SEH) to catch this exception.

설명Remarks

_malloca 는 요청이 _ALLOCA_S_THRESHOLD에 지정 된 특정 크기 (바이트)를 초과 하는 경우 프로그램 스택 또는 힙에서 크기 바이트를 할당 합니다._malloca allocates size bytes from the program stack or the heap if the request exceeds a certain size in bytes given by _ALLOCA_S_THRESHOLD. _Malloca_alloca 의 차이점은 _alloca 는 크기에 관계 없이 항상 스택에 할당 된다는 것입니다.The difference between _malloca and _alloca is that _alloca always allocates on the stack, regardless of the size. 할당 된 메모리를 해제 하기 위해 free 에 대 한 호출을 필요로 하거나 허용 하지 않는 _alloca와 달리 _malloca_freea 를 사용 하 여 메모리를 해제 해야 합니다.Unlike _alloca, which does not require or permit a call to free to free the memory so allocated, _malloca requires the use of _freea to free memory. 디버그 모드에서 _malloca 는 항상 힙에서 메모리를 할당 합니다.In debug mode, _malloca always allocates memory from the heap.

EH (예외 처리기)에서 _malloca 를 명시적으로 호출 하는 데 제한 사항이 있습니다.There are restrictions to explicitly calling _malloca 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. 따라서 다음 시나리오 중 하나에서 명시적으로 _malloca 를 호출 하면 호출 EH 루틴으로 돌아가는 동안 프로그램 오류가 발생 합니다.Therefore, explicitly calling _malloca in any of the following scenarios results in program failure during the return to the calling EH routine:

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

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

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

그러나 EH 루틴 내에서 직접 또는 이전에 나열 된 EH 시나리오 중 하나에서 호출 된 응용 프로그램 제공 콜백에서 직접 _malloca 를 호출할 수 있습니다.However, _malloca 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 블록 내에서 _malloca 를 호출 하는 경우 catch 블록에서 _resetstkoflw 를 호출 해야 합니다.In Windows XP, if _malloca is called inside a try/catch block, you must call _resetstkoflw in the catch block.

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

요구 사항Requirements

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

예: mallocaExample: malloca

// crt_malloca_simple.c
#include <stdio.h>
#include <malloc.h>

void Fn()
{
   char * buf = (char *)_malloca( 100 );
   // do something with buf
   _freea( buf );
}

int main()
{
   Fn();
}

예: malloca exceptionExample: malloca exception

// crt_malloca_exception.c
// This program demonstrates the use of
// _malloca and trapping any exceptions
// that may occur.

#include <windows.h>
#include <stdio.h>
#include <malloc.h>

int main()
{
    int     size;
    int     numberRead = 0;
    int     errcode = 0;
    void    *p = NULL;
    void    *pMarker = NULL;

    while (numberRead == 0)
    {
        printf_s("Enter the number of bytes to allocate "
                 "using _malloca: ");
        numberRead = scanf_s("%d", &size);
    }

    // Do not use try/catch for _malloca,
    // use __try/__except, since _malloca throws
    // Structured Exceptions, not C++ exceptions.

    __try
    {
        if (size > 0)
        {
            p =  _malloca( size );
        }
        else
        {
            printf_s("Size must be a positive number.");
        }
        _freea( p );
    }

    // Catch any exceptions that may occur.
    __except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
    {
        printf_s("_malloca failed!\n");

        // If the stack overflows, use this function to restore.
        errcode = _resetstkoflw();
        if (errcode)
        {
            printf("Could not reset the stack!");
            _exit(1);
        }
    };
}

입력Input

1000

샘플 출력Sample Output

Enter the number of bytes to allocate using _malloca: 1000

참조See also

메모리 할당Memory Allocation
calloccalloc
mallocmalloc
reallocrealloc
_resetstkoflw_resetstkoflw