【发布时间】:2013-06-13 15:55:22
【问题描述】:
我在 C 结构中有一个 char**,它在 C 代码中分配为 Nx128 矩阵。在 C# 中,我有一个字符串数组,我想将此数组复制到 char 双指针,而不重新分配任何内容。我试过这个:
public void StringArrayToPtr(IntPtr ptr, string[] array)
{
for (int i = 0; i < array.Length; i++)
{
char[] chars = (array[i] + '\0').ToCharArray();
Marshal.Copy(chars, 0, IntPtr.Add(ptr, 128*i), chars.Length);
}
}
但这不起作用。 有人知道如何进行这样的复制吗?
更新:
这是我的char** names 在 C 代码中分配 3 个项目的方式:names = (char **) MallocArray2D (3, 128, sizeof ( char ));
这里是MallocArray2D方法的详细信息:
void ** MallocArray2D (
int n1,
int n2,
int size_elem )
{
void ** p2;
void * p1;
size_t i;
p1 = (void *) malloc (size_elem * n1 * n2);
p2 = (void **) malloc (n1 * sizeof ( void * ));
for ( i = 0 ; i < n1 ; i++ )
{
p2[i] = (char *) p1 + size_elem * n2 * i;
}
return p2;
}
这个MallocArray2D 方法被调用到一个MallocImage 中,它在我的C# 代码中公开。
这是 C 代码中有趣的 MallocImage 方法部分:
int MallocImage (
IMAGE * image,
int nxyz,
int nvar )
{
//... Allocating others objects
image->names = (char **) MPDSMallocArray2D ( nvar, 128, sizeof ( char ));
}
现在我的 C# 暴露了MallocImage 方法:
[DllImport(DLL_PATH, CallingConvention = CallingConvention.Cdecl)]
public static extern int MallocImage([In, Out]Image image, int nXYZ, int nVar);
// My Image class
[StructLayout(LayoutKind.Sequential)]
class Image {
private IntPtr names;
public string[] Names {
set {ArrayOfStringToPtr(names, value);}
}
// Constructor
public Image(int nVar, int nXYZ) {
MallocImage(this, nXYZ, nVar);
}
}
// Somewhere else in my code
image.Names = new string[] {"porosity", "duplicity", "facies"];
【问题讨论】:
-
感谢您的编辑。仍然缺少一个重要部分:如何从 C# 代码中调用
MallocArray2D?还假设你是,你是否在StringArrayToPtr方法中使用p2指针? -
我在
StringArrayToPtr方法中使用的指针是我的C# 类的IntPtr names。我猜它对应p2指针,通过Marshalling过程 -
您能否验证
Image类的IntPtr names是否与IMAGE结构中的指针匹配?如果没有,请发布您的IMAGE结构。 -
两个指针匹配。
-
请看我编辑的答案
标签: c# char marshalling unmanaged-memory