gpt4 book ai didi

c# - Marshal.Copy,将一个 IntPtr 数组复制到一个 IntPtr

转载 作者:行者123 更新时间:2023-11-30 12:59:05 28 4
gpt4 key购买 nike

我不知道 Copy(IntPtr[], Int32, IntPtr, Int32) 方法是如何工作的。我虽然它可以将多个 IntPtr 中包含的数据复制到一个 IntPtr 中(如 MSDN 所述),但显然它没有像我预期的那样工作:

IntPtr[] ptrArray = new IntPtr[]
{
Marshal.AllocHGlobal(1),
Marshal.AllocHGlobal(2)
};

Marshal.WriteByte(ptrArray[0], 0, 0xC1);

// Allocate the total size.
IntPtr ptr = Marshal.AllocHGlobal(3);

Marshal.Copy(ptrArray, 0, ptr, ptrArray.Length);

// I expect to read 0xC1 but Value is always random!!
byte value = Marshal.ReadByte(ptr, 0);

有人知道我是否将此方法用于并非其目的的事情吗?

最佳答案

    static void Main(string[] args)
{
IntPtr[] ptrArray = new IntPtr[]
{
Marshal.AllocHGlobal(1),
Marshal.AllocHGlobal(2)
};

Marshal.WriteByte(ptrArray[0], 0, 100);

int size = Marshal.SizeOf(typeof(IntPtr)) * ptrArray.Length;
IntPtr ptr = Marshal.AllocHGlobal(size);

Marshal.Copy(ptrArray, 0, ptr, ptrArray.Length);

// Now we have native pointer ptr, which points to two pointers,
// each of thme points to its own memory (size 1 and 2).

// Let's read first IntPtr from ptr:
IntPtr p = Marshal.ReadIntPtr(ptr);

// Now let's read byte from p:
byte b = Marshal.ReadByte(p);

Console.WriteLine((int)b); // prints 100

// To do: release all IntPtr
}

阅读评论中的解释。

关于c# - Marshal.Copy,将一个 IntPtr 数组复制到一个 IntPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27167036/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com