Home » c# » Copy data from from IntPtr to IntPtr

Copy data from from IntPtr to IntPtr

Posted by: admin February 22, 2018 Leave a comment


I have two IntPtr values pointing to some data areas of length bytes. length may have an order of magnitude of 200k to 400k.

            int length = /* ..*/
            IntPtr ptrSrc = /*.. */;
            IntPtr ptrDst = /* .. */;

Now I want to copy the data from ptrSrc to ptrDst. This code works fine:

            byte[] data = new byte[length];
            Marshal.Copy(ptrSrc, data, 0, length);
            Marshal.Copy(data, 0, ptrDst, length);

but it has the drawback of needing an additional temporary (potentially huge) array. Unfortunately, I could not find a Marshal.Copy variant in the .NET framework for copying directly from IntPtr to IntPtr, so I am looking for alternatives.

I am interested in a solution which works on 32 Windows as well as 64 bit Windows. Any suggestions?


You can P/Invoke into the appropiate C function. That is probably the easiest way of doing that. Example:

class Program
    [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
    public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);

    static void Main()
        const int size = 200;
        IntPtr memorySource = Marshal.AllocHGlobal(size);
        IntPtr memoryTarget = Marshal.AllocHGlobal(size);



I think the answer needs an update in .net 4.6 there is

 Buffer.MemoryCopy Method (Void*, Void*, Int64, Int64)

This method copies sourceBytesToCopy bytes from the address specified by source to the address specified by destination. If the buffers overlap and the difference between destination minus source is less than sourceBytesToCopy, the source block is copied to the destination block in reverse order.

So if you not on 4.6 or universal windows app 10 then use the previous answer.