从C 到C#调用INT []显示随机大数字,而不是原始数组成员
P/Invoking int[] from c++ to C# shows random large numbers instead of original array members
我有以下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);
}
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 将C++浮点数组成员直接封送到 C#,而无需复制
- 用于对项目进行分组并将单个项目映射到其他组成员的数据结构
- C++ - 移动具有固定大小的 c 样式数组成员的类的构造函数
- C++内联数组成员统一初始化
- 有没有办法把字符串数组成员放在".structurevariable"前面?
- C++ 在具有数组成员的类上无效指针/双精度释放
- 将初始化列表传递给 C++ 中的数组成员
- 具有灵活数组成员的结构的大小
- 初始化固定的 C 数组成员结构
- 带有布尔数组成员的 C++ 结构.如何在主代码中使用
- 将元组成员包装在其他模板化类型中
- 我如何通过构造函数大小私人std ::数组成员
- 通过两个下标访问数组成员
- size_t结构非数组成员崩溃的强制转换
- 标准::元组成员逐个成员比较失败
- 从C 到C#调用INT []显示随机大数字,而不是原始数组成员
- 如何从 char 数组中提取数字字符串成员