繁体   English   中英

如何配置双指针?

[英]How to marshal a double pointer?

我正在尝试使用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重载进行读取和写入。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM