Почему массив в динамической области памяти инициализируется как-то странно?
Почему массив в динамической области памяти инициализируется как-то странно...
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 выделяет количество памяти в байтах, нужно для спана длину пересчитать в интах.