Marshal.Copy Method (Char[], Int32, IntPtr, Int32)


The .NET API Reference documentation has a new home. Visit the .NET API Browser on to see the new experience.

Copies data from a one-dimensional, managed character array to an unmanaged memory pointer.

Namespace:   System.Runtime.InteropServices
Assembly:  mscorlib (in mscorlib.dll)

public static void Copy(
	char[] source,
	int startIndex,
	IntPtr destination,
	int length


Type: System.Char[]

The one-dimensional array to copy from.

Type: System.Int32

The zero-based index in the source array where copying should start.

Type: System.IntPtr

The memory pointer to copy to.

Type: System.Int32

The number of array elements to copy.

Exception Condition

startIndex and length are not valid.


startIndex, destination, or length is null.

You can use this method to copy a subset of a one-dimensional managed array to an unmanaged C-style array.

The following example copies an array to unmanaged memory and then copies the unmanaged array back to managed memory.

// Remember that the actual size of System.Char in unmanaged memory is 2.
using System;
using System.Runtime.InteropServices;

class Example

    static void Main()
        // Create a managed array.
        char[] managedArray = new char[1000];
        managedArray[0] = 'a';
        managedArray[1] = 'b';
        managedArray[2] = 'c';
        managedArray[3] = 'd';
        managedArray[999] = 'Z';

        // Initialize unmanaged memory to hold the array.
        // int size = Marshal.SizeOf(managedArray[0]) * managedArray.Length;  // Incorrect
        int size = Marshal.SystemDefaultCharSize * managedArray.Length;       // Correct

        IntPtr pnt = Marshal.AllocHGlobal(size);

            // Copy the array to unmanaged memory.
            Marshal.Copy(managedArray, 0, pnt, managedArray.Length);

            // Copy the unmanaged array back to another managed array.

            char[] managedArray2 = new char[managedArray.Length];

            Marshal.Copy(pnt, managedArray2, 0, managedArray.Length);
            Console.WriteLine("Here is the roundtripped array: {0} {1} {2} {3} {4}",
                               managedArray2[0], managedArray2[1], managedArray2[2], managedArray2[3],

            Console.WriteLine("The array was copied to unmanaged memory and back.");

            // Free the unmanaged memory.




requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.

Universal Windows Platform
Available since 8
.NET Framework
Available since 1.1
Portable Class Library
Supported in: portable .NET platforms
Available since 2.0
Windows Phone Silverlight
Available since 7.0
Windows Phone
Available since 8.1
Return to top