c# 创建非托管对象* 数组

c# create unmanaged object* array

我需要创建一个非托管对象的可变长度数组,但我也需要该数组是非托管的,所以我不能使用 List<> 或其他 classes 但我必须 malloc/realloc 它以 c 方式。

这是我的代码:

unsafe class A{
    unsafe private int a1, a2;
    unsafe public byte* arr;
}

在不同的 class 方法上,我想做这样的事情:

private unsafe A* arr = Marshal.AllocHGlobal(array_size * Marshal.SizeOf<A>());

现在我有这些问题:

  1. 如何将IntPtr转为A*? OR 确实存在合适的 c# malloc/realloc 功能? OR 如果我 .dll 导入真正的 c/c++ realloc 函数会 使用安全吗?
  2. 如何获得指向 A 非托管对象的 A* 指针?如果我尝试使用“&”,它会显示 "cannot take the adress of [...] a managed object" 但不应对其进行管理。我在 class 声明中做错了吗?

可选:为什么 sizeof(A) 不起作用但 Marshal.SizeOf() 没问题?

你不能使用 C# class 来做这些事,但你可以使用 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);