Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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/4/c/72.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#_C_Marshalling_Dllimport - Fatal编程技术网

C# 如何在C中传递指向字节数组指针的指针

C# 如何在C中传递指向字节数组指针的指针,c#,c,marshalling,dllimport,C#,C,Marshalling,Dllimport,我必须从一个C应用程序调用一个来自声明为: void fillBuffer( uint8_t ** pData, uint32_t * size ); 此函数检查pData是否为null,以防它用一些奇特的数据填充缓冲区。变量大小它用作输入参数以限制将写入pData的字节数,并用作输出参数以通知实际写入的字节数 如果pData为null,它将分配缓冲区本身,并返回分配的字节数 如何从C应用程序声明和调用此函数,以避免在两种情况下都不安全(如果可能的话),即传递已分配的缓冲区或让它为我分配缓冲区

我必须从一个C应用程序调用一个来自声明为:

void fillBuffer( uint8_t ** pData, uint32_t * size );
此函数检查pData是否为null,以防它用一些奇特的数据填充缓冲区。变量大小它用作输入参数以限制将写入pData的字节数,并用作输出参数以通知实际写入的字节数

如果pData为null,它将分配缓冲区本身,并返回分配的字节数


如何从C应用程序声明和调用此函数,以避免在两种情况下都不安全(如果可能的话),即传递已分配的缓冲区或让它为我分配缓冲区?

如果没有不安全的上下文,则无法调用C函数。这根本不可能。除非您声明,否则您不能在托管上下文中使用不安全的指针。

我想我使用此解决方案解决了这个问题:

...
UInt32 len;
IntPtr ppData = IntPtr.Zero;

fillBuffer( ref ppData, out len );
...
并声明函数如下:

 [DllImport( "mylib.dll", CallingConvention = CallingConvention.Cdecl )]
 static extern void fillBuffer( ref IntPtr ppData,out UInt32 size );

谢谢

使用ref IntPtr声明一个重载,该重载传递IntPtr.Zero,并确保稍后使用适当的函数释放返回的内存。调用方法时,数据存储在执行堆栈上,从方法返回后无效。因此,如果C++试图将数据作为指针返回,则数据可以被销毁。因此,您必须使用三种方法之一1:在调用C++方法2之前,分配返回数据的最大大小,C++使用Windows分配方法分配返回数据。然后返回指向已分配数据的指针。您必须记住释放数据,这样就不会得到内存泄漏3调用C++,并且只返回大小。然后再次分配大小并调用方法。@jdweng您似乎对返回指向堆上分配的内存的指针感到困惑。后者是一种常见的模式,只要C端告诉您需要释放内存的内容,就完全可以使用C+C。一个例子是告诉你使用。@GSerg:我知道我在说什么。您只是在提议我的方法2,而不是使用Windows分配方法来使用C++堆。这是可行的,除非C不能从堆中释放,并且必须调用C++来进行解除分配。在使用Windows分配时,c可以直接调用c释放。你是如何释放内存的?我有另一个c函数,它正在这样做。我只是向它提供ppData中返回的指针。