[英]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.