Почему массив в динамической области памяти инициализируется как-то странно?

Почему массив в динамической области памяти инициализируется как-то странно...

internal sealed class Core
    {
        private static unsafe void Main()
        {
            const int bufferSize = 100;

            IntPtr memoryPointer = Marshal.AllocHGlobal(bufferSize);
            Span<byte> buffer = new Span<byte>(memoryPointer.ToPointer(), bufferSize);

            byte index = 0;
            foreach (ref int value in buffer)
                value = index++;

            foreach (ref readonly int value in buffer)
                Console.Write($"{value}, ");

            Marshal.FreeHGlobal(memoryPointer);
        }
    }

Выходные данные: 103, 111, 0, 98, 0, 0, 78...
А должно быть: 0, 1, 2, 3, 4, 5...


Ответы (1 шт):

Автор решения: Alexander Petrov

Так как вы используете Span<byte>, то и далее нужно использовать тип byte.
В обоих циклах меняем тип переменной value:

foreach (ref byte value in buffer)
    value = index++;

foreach (ref readonly byte value in buffer)
    Console.Write($"{value}, ");

Если нужно работать с типом int, то и спан нужно создавать с этим типом:

var buffer = new Span<int>(memoryPointer.ToPointer(), bufferSize / sizeof(int));

Так как Marshal.AllocHGlobal выделяет количество памяти в байтах, нужно для спана длину пересчитать в интах.

→ Ссылка