2014-07-05 42 views
0

我正在寫一個應用程序在c#中使用我用c寫的使用pinvoke的dll。 這裏是DLL的代碼:pinvoke返回ascii字符數組到c#

__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#代碼:

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); 
    } 
} 

現在,當指針返回時,字符的所述第一陣列的含量爲亂碼(中國字符)而不是「omer」爲什麼是這樣?

我想這可能是因爲在C#字符數組可能會使用Unicode編碼,但是當我在函數foo後改變之前測試中char_arr內容的價值被調用,它代表了ASCII

+1

非常基本的問題。 C#中的* char *與C中的char不匹配。C#版本需要2個字節,C類型最接近的匹配是* byte *。你的free()調用顯然是有缺陷的,你的C代碼中有兩個* malloc()調用,需要兩個free()調用來匹配。他們使用相同內存分配器的機率很低。 –

+0

謝謝你,我檢查我的免費電話沒有瑕疵我檢查和在C#中的指針具有相同的地址,分配在C – omer12433

+0

此代碼是錯誤的。這不是如何去做。您是否希望我們幫助您向您展示如何以正確的方式做到這一點,還是您已經設定好了? –

回答

1

字母你C代碼正在處理單字節字符,而C#代碼需要16位雙字節字符。

看一看related question