Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过C中的函数为指向数组的指针参数分配内存#_C# - Fatal编程技术网

C# 如何通过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]; } } 这是我收到的错误: 只能在固定语句初始值设

如何向函数发送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];
    }
}
这是我收到的错误:

只能在固定语句初始值设定项中获取非固定表达式的地址

最初我使用的是一个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.
    }
}