_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. 자세한 내용은 플랫폼 호출 예제.