3

我有一个指向整数(未知等级)的多维指针数组被传递到我的函数中:

    public unsafe static void MyMethod(Array source, ...)
    {
         //...
    }

指针的多维数组在方法之外被构造并被传入。下面是一个例子:

int*[,,,] testArray = new int*[10,10,5,5];

MyMethod(testArray);

如何在数组中运行时计算的索引处设置值?Array.SetValue(...) 适用于非指针数组,但拒绝适用于我的 int* 数组。使用反射器,我看到 SetValue 减少到调用 InternalSetValue ,它接受一个对象作为值,但它被标记为 extern 并且我看不到实现。我在黑暗中开了一枪,并尝试传递盒装指针,但没有运气。

4

2 回答 2

4

这有效:

unsafe static void MyMethod(int** array)
{
    array[10] = (int*)0xdeadbeef;
}

private static unsafe void Main()
{
    int*[, , ,] array = new int*[10, 10, 10, 10];

    fixed (int** ptr = array)
    {
        MyMethod(ptr);
    }

    int* x = array[0, 0, 1, 0]; // == 0xdeadbeef
}

这有帮助吗?


给专家的问题:假设数组在内存中连续分配是错误的吗?

于 2009-12-07T18:53:07.687 回答
1

这不起作用,因为不可能在 .NET 中装箱指针,因此您永远不能调用Array.SetValue并传递int*.

你可以声明MyMethod接受int*[,,,]吗?

编辑:为了进一步阅读,Eric Lippert 最近发表的一篇有趣的文章

于 2009-12-07T18:44:27.330 回答