C# 使用 IntPtr 来表示外部分配的内存。C# 指针和引用只能与垃圾收集器提供的内存一起使用。
System.InteropServices.Marshal 类提供了一些与 IntPtr 表示的本机内存区域进行交互的方法,当然它们不是类型安全的。
但是我在您的函数中看不到任何可以返回指向已分配内存的指针的内容。您需要一个双指针参数或一个指针返回值,而您两者都没有。
编辑按要求添加示例:
// this doesn't work right
void external_alloc_and_fill(int n, int* result)
{
result = new int[n];
while (n-- > 0) { result[n] = n; }
}
extern external_alloc_and_fill(int n, int* result)
int a = 5;
fixed (int* p = &a) {
external_alloc_and_fill(17, p);
// p still points to a, a is still 5
}
更好的:
// works fine
void external_alloc_and_fill2(int n, int** presult)
{
int* result = *presult = new int[n];
while (n-- > 0) { result[n] = n; }
}
extern external_alloc_and_fill2(int n, ref IntPtr result)
int a 5;
IntPtr p = &a;
external_alloc_and_fill2(17, ref p);
// a is still 5 but p is now pointing to the memory created by 'new'
// you'll have to use Marshal.Copy to read it though