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
非常基本的問題。 C#中的* char *與C中的char不匹配。C#版本需要2個字節,C類型最接近的匹配是* byte *。你的free()調用顯然是有缺陷的,你的C代碼中有兩個* malloc()調用,需要兩個free()調用來匹配。他們使用相同內存分配器的機率很低。 –
謝謝你,我檢查我的免費電話沒有瑕疵我檢查和在C#中的指針具有相同的地址,分配在C – omer12433
此代碼是錯誤的。這不是如何去做。您是否希望我們幫助您向您展示如何以正確的方式做到這一點,還是您已經設定好了? –