다음을 통해 공유


stackalloc(C# 참조)

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

int* block = stackalloc int[100];

설명

키워드는 지역 변수 이니셜라이저에서만 유효합니다. 다음 코드는 컴파일러 오류를 발생시킵니다.

int* block;
// The following assignment statement causes compiler errors. You
// can use stackalloc only when declaring and initializing a local 
// variable.
block = stackalloc int[100];

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

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

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

예제

class Test
{
    static unsafe void Main()
    {
        const int arraySize = 20;
        int* fib = stackalloc int[arraySize];
        int* p = fib;
        // The sequence begins with 1, 1.
        *p++ = *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; ++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
6765
*/

보안

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

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. C# 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.

참고 항목

참조

C# 키워드

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

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

개념

C# 프로그래밍 가이드

기타 리소스

C# 참조