pinvoke将ascii字符数组返回到c#

pinvoke将ascii字符数组返回到c#,c#,c,dll,pinvoke,dllimport,C#,C,Dll,Pinvoke,Dllimport,我正在用c编写一个应用程序,它使用我用pinvoke用c编写的dll。 以下是dll的代码: __declspec(dllexport) char** foo() { int i; char arr[5]="omer"; char **str_arr=(char**)malloc(sizeof(char*)); str_arr[0]=(char*)malloc(sizeof(char)*5); strcpy

我正在用c编写一个应用程序,它使用我用pinvoke用c编写的dll。 以下是dll的代码:

 __declspec(dllexport) char** foo()
    {
        int i;
        char arr[5]="omer";
        char **str_arr=(char**)malloc(sizeof(char*));
        str_arr[0]=(char*)malloc(sizeof(char)*5);
        strcpy(str_arr[0],arr);
        return str_arr;
    }
下面是c#中的代码:

类程序
{
[DllImport(“gg.dll”,CallingConvention=CallingConvention.Cdecl)]
公共静态不安全外部字符**foo();
静态不安全void Main(字符串[]args)
{
int[]arr;
int i;
char[]char_arr={'o','m','e','r'};
string[]string_arr=新字符串[1];
字符**str_arr;
str_arr=foo();
对于(i=0;i<4;i++)
{
char_arr[i]=str_arr[0][i];
}
字符串_arr[0]=新字符串(st);
免费(*str_arr);
免费(str_arr);
}
}
现在当指针返回时,第一个字符数组的内容是乱七八糟的(中文字符),而不是“omer”,这是为什么


我想这可能是因为c#中的char数组可能使用unicode编码,但当我在调用函数foo后更改char#arr中的内容值之前,测试了它的值,它表示ASCII中的字母,您的
C
代码使用单字节字符,而
C
代码需要16位双字节字符


看看一个非常基本的问题。C#中的字符与C中的字符不匹配。C#版本需要2个字节,与C变体最接近的匹配是字节。您的free()调用显然有缺陷,您的C代码中有两个malloc()调用,这需要两个free()调用来匹配。他们使用相同内存分配器的几率很低。谢谢你,我检查我的免费呼叫是否有缺陷。我检查,c中的指针与c中分配的地址相同。这段代码完全错误。这不是怎么做的。大卫·赫弗南:我想让你告诉我正确的方法,我真想知道我做错了什么?代码可能很难看,只是因为它只是我写的一个小片段,尝试将字符串从c传输到c。当我将代码集成到我的应用程序时,我的代码将更具可读性,并且不使用良好的代码实践。使用SysAllocString返回BSTR
class Program
{

    [DllImport("gg.dll", CallingConvention = CallingConvention.Cdecl)]
    public static unsafe extern char** foo();
    static unsafe void Main(string[] args)
    {
      int  [] arr;
      int i;
    char [] char_arr={'o','m','e','r'};
      string[] string_arr=new string [1];
      char** str_arr;
        str_arr=foo();
        for (i = 0; i < 4; i++)
        {
           char_arr[i]=str_arr[0][i];
        }
        string_arr[0] = new string(st);
        free(*str_arr);
       free(str_arr);
    }
}