C# コードから C コードを呼び出す方法を学習しています。int の 2D 配列を返す C 関数を呼び出したいと考えています。この関数は引数を取りません。関数は次のとおりです。
extern "C" _declspec(dllexport) int** intMatrixReturn()
{
int** A = (int**)malloc(3 * sizeof(int *));
for(int i = 0; i < 3; i++)
{
A[i] = (int*)malloc(3 * sizeof(int));
for(int j = 0; j < 3; j++)
{
A[i][j] = i * j;
}
}
return A;
}
これは、C# コードで配列にアクセスしようとしている方法です。
IntPtr ip = intArrayReturn();
int[] iarr = new int[9];
Marshal.Copy(ip, iarr, 0, 9);
foreach (var item in iarr)
{
Console.WriteLine(item);
}
これは私のコンソール出力です:
1
2
3
4218
86245572
86252624
0
0
0
私の問題は C# コードにあると思います。C 関数から返される 2D int 配列を読み取るにはどうすればよいですか? また、ガベージ コレクターは 2D 配列を保持するメモリを解放しますか、それとも C# コードでそれを行う必要がありますか?
これが重複している場合は申し訳ありませんが、2D 配列に関して私が見つけたすべての質問には、C# から C への送信が含まれており、その逆ではありません。