stackalloc (C#-Referenz)

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

int* block = stackalloc int[100];

Hinweise

Das Schlüsselwort ist nur in den lokalen Variableninitialisierern gültig. Im folgenden Code werden Compilerfehler verursacht.

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];

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

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

Im folgenden Beispiel werden die ersten 20 Zahlen in der Fibonacci-Sequenz berechnet und angezeigt. Jede Zahl ist die Summe der vorherigen zwei Zahlen. Im Code wird ein Speicherblock, der groß genug für 20 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.

Beispiel

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
*/

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.

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auch

Referenz

C#-Schlüsselwörter

Operatorschlüsselwörter (C#-Referenz)

Unsicherer Code und Zeiger (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch

Weitere Ressourcen

C#-Referenz