stackalloc (Référence C#)

Mise à jour : novembre 2007

Le mot clé stackalloc est utilisé dans un contexte de code unsafe pour allouer un bloc de mémoire sur la pile.

int* fib = stackalloc int[100];

Notes

L'exemple suivant renvoie une suite de Fibonacci de 100 nombres, chaque nombre étant la somme des deux nombres précédents. Dans le code, un bloc de mémoire d'une taille suffisante pour contenir 100 éléments de type int est alloué sur la pile, et non sur le tas. L'adresse du bloc est stockée dans le pointeur fib. Cette mémoire ne fait pas l'objet de garbage collection et ne doit donc pas être épinglée (par le biais de fixed). La durée de vie du bloc de mémoire est limitée à la durée de vie de la méthode qui le définit. Vous ne pouvez pas libérer la mémoire avant le retour de la méthode.

stackalloc est valide seulement dans les initialiseurs de variable locale.

Des types pointeur étant impliqués, stackalloc requiert un contexte unsafe. Pour plus d'informations, consultez Pointeurs et code unsafe (Guide de programmation C#).

stackalloc est similaire à _alloca dans la bibliothèque Runtime C.

Sécurité

Le code unsafe est moins sûr que les alternatives safe. Toutefois, l'utilisation de stackalloc active automatiquement les fonctionnalités de détection de dépassement de mémoire tampon dans le common language runtime (CLR). Si un dépassement de mémoire tampon est détecté, le processus est terminé aussi rapidement que possible, afin de réduire les risques d'exécution de code malveillant.

Exemple

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

Spécification du langage C#

Pour plus d'informations, consultez la section suivante dans Spécifications du langage C#.

  • 18.8 Allocation de pile

Voir aussi

Concepts

Guide de programmation C#

Référence

Mots clés C#

Mots clés des opérateurs (Référence C#)

Pointeurs et code unsafe (Guide de programmation C#)

Autres ressources

Référence C#