Share via


stackalloc(C# 참조)

업데이트: 2007년 11월

stackalloc 키워드는 안전하지 않은 코드 컨텍스트에서 스택에 메모리 블록을 할당하는 데 사용됩니다.

int* fib = stackalloc int[100];

설명

다음 예제에서는 피보나치 수열의 숫자 100개를 출력합니다. 이때 각 숫자는 이전 두 숫자의 합입니다. 이 코드에서 int 형식의 요소 100개를 포함하는 데 충분한 크기의 메모리 블록은 힙이 아니라 스택에 할당됩니다. 블록의 주소는 포인터 fib에 저장됩니다. 이 메모리는 가비지 수집의 영향을 받지 않으므로 fixed를 사용하여 고정하지 않아도 됩니다. 메모리 블록의 수명은 해당 메모리 블록이 정의된 메서드의 수명에 따라 제한됩니다. 즉, 메서드에서 반환하기 전에는 메모리를 해제할 수 없습니다.

stackalloc은 지역 변수 초기 값에서만 유효합니다.

포인터 형식이 관련되기 때문에 stackalloc에는 unsafe 컨텍스트가 필요합니다. 자세한 내용은 안전하지 않은 코드 및 포인터(C# 프로그래밍 가이드)를 참조하십시오.

stackalloc는 C 런타임 라이브러리의 _alloca와 비슷합니다.

보안

안전하지 않은 코드는 안전한 코드보다 위험합니다. 그러나 stackalloc을 사용하면 CLR(공용 언어 런타임)에서 버퍼 오버런 감지 기능이 자동으로 활성화됩니다. 버퍼 오버런을 감지하면 프로세스가 가능한 한 신속하게 종료되어 악의적인 코드가 실행될 가능성을 최소화합니다.

예제

class Test
{
    static unsafe void Main()
    {
        const int arraySize = 20;
        int* fib = stackalloc int[arraySize];
        int* p = fib;
        *p++ = 1;
        for (int i = 2; i < arraySize; ++i, ++p)
        {
            // Sum the previous two numbers.
            *p = p[-1] + p[-2];
        }
        for (int i = 0; i < arraySize - 1; ++i)
        {
            Console.WriteLine(fib[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/*
Output
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
*/

C# 언어 사양

자세한 내용은 C# 언어 사양에서 다음 단원을 참조하십시오.

  • 18.8 스택 할당

참고 항목

개념

C# 프로그래밍 가이드

참조

C# 키워드

연산자 키워드(C# 참조)

안전하지 않은 코드 및 포인터(C# 프로그래밍 가이드)

기타 리소스

C# 참조