Существует встроенная функция, которая берет массивы указателей на массивы данных, например, char, выделенный с помощью malloc.
void function(char** data, int nRows)
{
for (int i = 0; i < nRows; i++)
{
int nCols = _msize(data[i]);
for (j = 0; j < nCols; j++)
char val = data[i][j];
}
}
В управляемом коде у меня есть перечисление массивов byte [] для передачи этой функции через PInvoke
unsafe void MyFunction(IEnumerable<byte[]> data)
{
var handles = data.Select(d => GCHandle.Alloc(d, GCHandleType.Pinned));
var ptrs = handles.Select(h => h.AddrOfPinnedObject());
IntPtr[] dataPtrs = ptrs.ToArray();
uint nRows = (uint)dataPtrs.Length;
function(dataPtrs, nRows);
handles.ToList().ForEach(h => h.Free());
}
[DllImport("function.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
static extern unsafe internal void function(IntPtr[] data, uint nRows);
Однако вызов _msize в нативном коде приводит к повреждению кучи. Я помню, я использовал stackalloc с одномерным массивом char * и сцепленными массивами byte [] вместе.
Но мне нужна поддержка «зазубренного массива» с отдельными массивами byte [] разных размеров, поэтому мне нужен массив указателей char **.
Как закрепить массивы byte [], чтобы _msize работал правильно, как в случае с stackalloc?