从C 到C#调用INT []显示随机大数字,而不是原始数组成员

P/Invoking int[] from c++ to C# shows random large numbers instead of original array members

本文关键字:数字 组成员 数组 原始 随机 调用 INT 显示      更新时间:2023-10-16

我有以下C 代码:

int nCount[5] = {0, 1, 2, 3, 4};    
return &nCount[0];

我正在用C#P/Indoke Layer接收此代码,并带有以下代码:

[DllImport(@"/sharedlibrary.so",CallingConvention = CallingConvention.Cdecl)]                                
 public extern static IntPtr read_array_adapter();

效果很好。但是当我在下面运行C#代码时:

int[] result = new int[5];
Marshal.Copy(ptr, result, 0, 5); 

它以一些随机的大数字填充了数组结果,如下所示:

int[]{1663918692,1852139884,1970351988,1936417641,244554078}

哪个与我的原始数组无关的C ,看起来像{0,1,2,3,4}任何想法Marshal.Copy在填充这类结果时可能会做什么?

如果要存储在函数范围中,并且不想使用全局变量,则必须从其他地方分配它(本地变量(。

您可以使用任何分配器,可以使用.NET已知的一个,或者如果您使用另一个特定于C 或平台的分配器,则还必须提供另一个可用于DealLocation的P/DeSokokable功能,例如:

C

int* read_array_adapter()
{
    int nCount[5] = {0, 1, 2, 3, 4};    
    return AllocateAndCopy(...);
}
void free_array_adapter(int *) // or a generic pointer of course...
{
    Free(...);
}

c#

static void Main(string[] args)
{
    var ptr = read_array_adapter();
    var result = new int[5];
    Marshal.Copy(ptr, result, 0, 5);
    free_array_adapter(ptr);
}
[DllImport(@"/sharedlibrary.so",CallingConvention = CallingConvention.Cdecl)]                                
public extern static IntPtr read_array_adapter();
[DllImport(@"/sharedlibrary.so",CallingConvention = CallingConvention.Cdecl)]                                
public extern static void free_array_adapter(IntPtr ptr);

您也可以在.NET和C/C 之间使用已知的分配器,但这取决于平台(Windows,Linux等(:https://www.mono-project.com/docs/docs/advanced/pinvoke/

这是一个带有C的Malloc/Free Duo的示例实现:

int* read_array_adapter()
{
    int nCount[5] = { 0, 1, 2, 3, 4 };
    int* p = (int*)malloc(5 * 4);
    memcpy(p, nCount, 5 * 4);
    return p;
}
void free_array_adapter(void * ptr)
{
    free(ptr);
}