C# 如何通过C中的函数为指向数组的指针参数分配内存#
如何向函数发送ref指针,并将地址返回到分配的内存中(用C#表示)。以下代码未编译:C# 如何通过C中的函数为指向数组的指针参数分配内存#,c#,C#,如何向函数发送ref指针,并将地址返回到分配的内存中(用C#表示)。以下代码未编译: class Test { public byte [] byteArr_1 = new byte [1024]; //public byte* P_byte; public unsafe void SetAddress(ref byte* p_b) { p_b = &byteArr_1[0]; } } 这是我收到的错误: 只能在固定语句初始值设
class Test
{
public byte [] byteArr_1 = new byte [1024];
//public byte* P_byte;
public unsafe void SetAddress(ref byte* p_b)
{
p_b = &byteArr_1[0];
}
}
这是我收到的错误:
只能在固定语句初始值设定项中获取非固定表达式的地址
最初我使用的是一个usb传输dll,在建立连接时接收并初始化一个*字节指针作为缓冲区。现在我想用一个不同的平台来更改dll,代码更改最少,所以我需要自己初始化缓冲区
谢谢,编译器告诉您需要使用。如前所述,您可以使用锁定对象,但这对您不起作用,因为您是通过ref参数返回指针的。如果您试图使用fixed语句,代码将被编译,但使用时生成的指针可能无效。这是因为一旦退出固定语句块,对象将被取消固定,从而允许其地址随时更改 在这种情况下,需要使用以下方法固定缓冲区:
如果正在调用的非托管代码需要一个指向缓冲区的指针很长时间,那么您首先不希望传递托管缓冲区。为什么?因为托管缓冲区必须被固定很长时间,这使得垃圾收集器做额外的工作 相反,使用非托管内存分配器分配非托管缓冲区,并将指向该缓冲区的指针传递给非托管代码
class Test
{
public byte [] byteArr_1 = new byte [1024];
private GCHandle pinned;
//public byte* P_byte;
public unsafe void SetAddress(ref byte* p_b)
{
pinned = GCHandle.Alloc(byteArr_1, GCHandleType.Pinned);
p_b = (byte*)pinned.AddrOfPinnedObject();
// NOTE: Don't forget to free the GCHandle at some point via GCHandle.Free!
// Remember that once this handle is freed, the pointer should not be used in any way.
}
}