如何在不安全的C#代码中获取指向可变数量数组的指针

问题描述

如果我有一个double [,]对象的数组,该数组的长度事先已知,那么我可以设置一个指向double [,]对象的指针数组,如下所示:

int NumMatrices = 3;
double[][,] VectorOfMatrix = new double[NumMatrices][,];
for (int i = 0; i < VectorOfMatrix.Length; i++) VectorOfMatrix[i] = new double[10,10];
unsafe {
    fixed (double* fpM0 = VectorOfMatrix[0],fpM1 = VectorOfMatrix[1],fpM2 = VectorOfMatrix[2]) {
        double** ppMatrix = stackalloc double*[3];
        ppMatrix[0] = fpM0;
        ppMatrix[1] = fpM1;
        ppMatrix[2] = fpM2;
        ...
    }
}

但是如果事先不知道数组的长度,那么等效的东西怎么办?

解决方法

最终,您不能这样做。从JIT的角度来看,它是“本地”标记,它们定义为fixed,因此您需要{em 1}}元素,则本地数量是在编译时确定的,而不是在运行时确定的。

怀疑,当您需要单个内部数组时,在呼叫站点需要本地范围的fixed-但这不是很成问题:fixed是一种非常便宜的固定方式(实际上,它只是堆栈上的参考副本,而JIT从上下文中知道它的意思是“固定”)

那是说:我怀疑,您也许也可以在此处使用跨度,而不必使用fixed或指针。