如何封送双指针

本文关键字:指针 何封送 | 更新日期: 2023-09-27 18:30:05

我正在尝试使用pinvoke将C结构封送到C#。虽然我可以封送intptr,但我找不到封送双指针的语法。在C端同时使用int指针和double指针来分配int或double数组。

这是C结构:

struct xyz
{
      int *np;  // an int pointer works fine
      double *foo;
};

这是c类:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class xyz
{
    Intptr np;  // works fine
            // double *foo   ?? 
   }

我找不到任何关于如何进行的说明

如何封送双指针

查看IntPtr的描述。您是否尝试过使用:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class xyz
{
    IntPtr np;
    IntPtr foo;
}

您似乎认为IntPtr是指向int的指针。事实并非如此。IntPtr是一个与指针宽度相同的整数。所以IntPtr在x86上是32位宽,在x64上是64位宽。文件清楚地说明了这一切。

IntPtr最接近的等效本机类型是void*,一个非类型化指针。

所以你的C#课程应该是:

[StructLayout(LayoutKind.Sequential)]
public class xyz
{
    IntPtr np;
    IntPtr foo;
}

为了读取np引用的标量值,请调用Marshal.ReadInt32。并将其编写为Marshal.WriteInt32。但更有可能的是,由于这是一个指针,指针指向的是一个数组。在这种情况下,您可以使用适当的Marshal.Copy重载进行读取和写入。

对于指向double的指针,如果该值是标量,则Marshal中没有读取或写入该值的方法。但是,它肯定是一个数组,在这种情况下使用Marshal.Copy来访问内容。