Это ключевое слово допустимо только в инициализаторах локальных переменных:
int* block = stackalloc int[100];Начиная с версии C# 7.3 (C# 7.3) для массивов stackalloc можно использовать синтаксис
инициализатора массива:
int* first = stackalloc int[3] { 1, 2, 3 };
int* second = stackalloc int[] { 1, 2, 3 };
int* third = stackalloc[] { 1, 2, 3 };
// битовая маска задаёт 1 бит в каждом элементе
int* mask = stackalloc[] {
0b_0000_0000_0000_0001,
0b_0000_0000_0000_0010,
0b_0000_0000_0000_0100,
0b_0000_0000_0000_1000,
0b_0000_0000_0001_0000,
0b_0000_0000_0010_0000,
0b_0000_0000_0100_0000,
0b_0000_0000_1000_0000,
0b_0000_0001_0000_0000,
0b_0000_0010_0000_0000,
0b_0000_0100_0000_0000,
0b_0000_1000_0000_0000,
0b_0001_0000_0000_0000,
0b_0010_0000_0000_0000,
0b_0100_0000_0000_0000,
0b_1000_0000_0000_0000
};
// 1
// 2
// 4
// 8
...
// 4096
// 8192
// 16384
// 32768Так как задаются типы указателей (Типы указателей), stackalloc требует небезопасного контекста.
Небезопасный код менее безопасен, чем безопасные аналоги. При использовании stackalloc
в среде CLR автоматически включается обнаружение переполнения буфера.
В этом коде блок памяти, размер которого позволяет сохранить 20 элементов типа int,
выделяется не куче (динамическая память), а стеку.
Адрес блока хранится в указателе fib.
Эта память не подвергается сборке мусора и её не нужно закреплять с помощью атрибута
fixed.
Время существования блока памяти ограничивается временем существования метода, который
его определяет.
