stackalloc (C#-Referenz)

Aktualisiert: November 2007

Das stackalloc-Schlüsselwort wird in einem unsicheren Codekontext verwendet, um einen Speicherblock auf dem Stapel zu reservieren.

int* fib = stackalloc int[100];

Hinweise

Im folgenden Beispiel wird die Fibonacci-Folge von 100 Zahlen, bei denen jede Zahl die Summe der vorhergehenden zwei Zahlen darstellt, ausgegeben. Im Code wird ein Speicherblock, der groß genug für 100 Elemente vom Typ int ist, auf dem Stapel reserviert, nicht auf dem Heap. Die Adresse des Blocks wird im fib-Zeiger gespeichert. Dieser Speicher ist nicht der Garbage Collection unterworfen und muss daher nicht mit fixed fixiert werden. Die Lebensdauer des Speicherblocks ist auf die Lebensdauer der Methode begrenzt, in der er definiert ist. Sie können den Speicher nicht freigeben, bevor die Methode einen Wert zurückgibt.

stackalloc ist nur in lokalen Variableninitialisierern zulässig.

Da Zeigertypen beteiligt sind, verlangt stackalloc einen unsicheren Kontext. Weitere Informationen hierzu finden Sie unter Unsicherer Code und Zeiger (C#-Programmierhandbuch).

stackalloc kann mit _alloca in der C-Laufzeitbibliothek verglichen werden.

Sicherheit

Unsicherer Code ist weniger sicher als sichere Alternativen. Die Verwendung von stackalloc aktiviert jedoch automatisch Features zur Erkennung von Pufferüberläufen in der Common Language Runtime (CLR). Wenn ein Pufferüberlauf festgestellt wird, wird der Prozess so schnell wie möglich beendet, um die Gefahr der Ausführung von bösartigem Code zu minimieren.

Beispiel

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#-Programmiersprachenspezifikation

Weitere Informationen finden Sie im folgenden Abschnitt in der C#-Programmiersprachenspezifikation:

  • 18.8 Stapelreservierung

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

C#-Schlüsselwörter

Operatorschlüsselwörter (C#-Referenz)

Unsicherer Code und Zeiger (C#-Programmierhandbuch)

Weitere Ressourcen

C#-Referenz