C# 中的 Marshall double[] 到 IntPtr

作者:编程家 分类: arrays 时间:2025-10-31

# 将C#中的double[]数组转换为IntPtr:使用Marshal类

在C#中,经常需要在不同的数据类型之间进行转换,特别是在与非托管代码进行交互的情况下。本文将介绍如何使用C#的`Marshal`类将`double[]`数组转换为`IntPtr`类型,并提供相应的代码示例。

## Marshal类简介

`Marshal`类是C#中用于与非托管代码进行交互的重要工具之一。它提供了一组方法,用于在托管代码和非托管代码之间进行数据传输,包括内存分配、复制和释放等操作。在本文中,我们将使用`Marshal`类来实现`double[]`到`IntPtr`的转换。

## 将double[]数组转换为IntPtr的步骤

要将`double[]`数组转换为`IntPtr`,我们可以按照以下步骤进行操作:

1. 分配内存空间: 使用`Marshal.AllocHGlobal`方法为`double[]`数组分配内存空间。

2. 复制数据: 使用`Marshal.Copy`方法将`double[]`数组的数据复制到分配的内存空间。

3. 获取IntPtr: 使用`Marshal.UnsafeAddrOfPinnedArrayElement`方法获取指向分配内存空间的`IntPtr`。

下面是一个简单的例子,演示了如何执行这些步骤:

csharp

using System;

using System.Runtime.InteropServices;

class Program

{

static void Main()

{

// 示例数据

double[] doubleArray = { 1.0, 2.5, 3.7, 4.2 };

// 步骤1: 分配内存空间

IntPtr ptr = Marshal.AllocHGlobal(doubleArray.Length * sizeof(double));

try

{

// 步骤2: 复制数据到分配的内存空间

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

// 步骤3: 获取IntPtr

IntPtr doubleArrayPtr = Marshal.UnsafeAddrOfPinnedArrayElement(doubleArray, 0);

// 打印结果

Console.WriteLine("Original double[] Address: " + doubleArrayPtr);

Console.WriteLine("Converted IntPtr Address: " + ptr);

}

finally

{

// 释放分配的内存空间

Marshal.FreeHGlobal(ptr);

}

}

}

##

本文介绍了如何使用C#中的`Marshal`类将`double[]`数组转换为`IntPtr`。通过分配内存空间、复制数据并获取指针,我们能够在托管代码和非托管代码之间有效地传递数据。确保在使用完毕后释放分配的内存空间,以避免内存泄漏问题。这种转换在与非托管代码进行交互时非常有用,特别是在涉及到平台调用等场景中。