我需要创建一个非托管对象的可变长度数组,但是我也需要这个数组也是非托管的,所以我不能使用List<>或其他类,但我必须以c方式malloc / realloc。
这是我的代码:
unsafe class A{
unsafe private int a1, a2;
unsafe public byte* arr;
}
并且在不同的类方法上我想做这样的事情:
private unsafe A* arr = Marshal.AllocHGlobal(array_size * Marshal.SizeOf<A>());
现在我提出这些问题:
可选:为什么sizeof(A)不起作用,但Marshal.SizeOf()没关系?
答案 0 :(得分:2)
你不能使用C#类来做这些事情,但你可以使用struct:
[StructLayout(LayoutKind.Sequential)]
struct A
{
public int A1;
public int A2;
}
int array_size = 5;
// just cast IntPtr to A*
A* arr = (A*) Marshal.AllocHGlobal(array_size * Marshal.SizeOf<A>());
// set first element of unmanaged array
arr[0] = new A {A1 = 1, A2 = 2};
// set second
arr[1] = new A {A1 = 3, A2 = 4};
// alternative syntax:
// set first element
*arr = new A { A1 = 5, A2 = 6 };
// set second element
*(arr + 1) = new A { A1 = 5, A2 = 6 };
// get first element
var first = *arr;
var second = *(arr + 1);
Console.WriteLine(first.A1 + " " + first.A2);
Marshal.FreeHGlobal((IntPtr)arr);