C# 如何将分配的内存块强制转换为数组可寻址数据类型。

C# 如何将分配的内存块强制转换为数组可寻址数据类型。,c#,pointers,casting,pinvoke,C#,Pointers,Casting,Pinvoke,我正在尝试将一些数据从c#封送到c库。我需要传递的结构只是指针的集合。。。比如: 然而,我很快意识到c库实际上保留了对结构的引用,并且在一段时间后,当数组被移动或收集时,预期会中断。因此,我的解决方案是使用Marshal.AllocHGlobal分配一块内存,并在c库需要该数据的整个时间内保持引用 所以我运行这个: IntPtr*pointerArray=(IntPtr*)marshall.AllocHGlobal(IntPtr.Size*4) 然而,pointerArray总是显示为IntP

我正在尝试将一些数据从c#封送到c库。我需要传递的结构只是指针的集合。。。比如:


然而,我很快意识到c库实际上保留了对结构的引用,并且在一段时间后,当数组被移动或收集时,预期会中断。因此,我的解决方案是使用
Marshal.AllocHGlobal
分配一块内存,并在c库需要该数据的整个时间内保持引用

所以我运行这个:

IntPtr*pointerArray=(IntPtr*)marshall.AllocHGlobal(IntPtr.Size*4)

然而,
pointerArray
总是显示为
IntPtr.Zero
。。。或者我猜。。。只有零


我做错了什么?我不能将内存块强制转换为指针数据类型吗?如果我想要一个
byte*
int*
,这样我就可以像数组一样操作内存块了?

你是说
Marshal.AllocHGlobal(IntPtr.Size*4)
的计算结果为零?为了测试的目的,试着写下这一行。我不能相信16或32不能被分配。@usr这正是我所说的。在运行该行之后,断点并查看pointerArray会得到0x000..0。这种情况也经常发生。每次都不会失败。@HansPassant如果是这样,运行时不会抛出内存不足异常吗?这没有发生,但分配不可能真正给我地址0。我不相信。用这个分配行创建一个新的控制台应用程序。我跟你打赌它一定不会失败。您的系统很可能还剩下一页内存。。。可能是您损坏了堆(双重释放?无效内存写入?),您是对的。它确实有效。它可以从我的另一个应用程序复制精确的行。它在我的其他应用程序中不起作用。。。古怪的 struct sometype { type1* element1; type2** element2; type3** element3; type4* element4; }

fixed(IntPtr* ptr = structArray){
    InteropCall(ptr);
}