访问冲突在递归函数中写入位置0x00000000指针

时间:2017-10-25 09:47:19

标签: c pointers recursion matrix memory-management

这是我的代码,用于计算复数矩阵的行列式。我必须定义像这样的矩阵(双指针),因为我正在使用一个非常古老的C项目。(不要问为什么)

int i, j, k, c1, c2;


typedef struct {
    double re;
    double im;
} cmplx;


cmplx** Create2DMatrixCmplx(int d1, int d2)
{
    cmplx **matCC = (cmplx**)malloc(d1 * sizeof(cmplx*));

    for (i = 0; i < d1; i++)
        matCC[i] = ((cmplx*)malloc(d2 * sizeof(cmplx)));

    if ( matCC == NULL )
    {
        printf("Error: out of memory.\n");
        return;
    }
    return matCC;
}



void matrixCAssign(cmplx** a1, cmplx** a2, int l1, int l2)
{
    for (i = 0; i < l1; i++)
        for (j = 0; j < l2; j++)    
            a1[i][j] = a2[i][j];
}


cmplx determinantC(cmplx **A, int len)
{
    cmplx det, temp;
    cmplx** Matrix =  Create2DMatrixCmplx(len, len);
    cmplx** Minor =  Create2DMatrixCmplx(len, len);
    matrixCAssign( Matrix, A, len, len );

    if(len == 1)
    {
        det = Matrix[0][0];
    }
    else if(len == 2)
    {
        det = (Matrix[0][0] * Matrix[1][1]) - (Matrix[0][1] * Matrix[1][0]));
    }
    else
    {
        for(i = 0 ; i < len ; i++)
        {
            c1 = 0, c2 = 0;
            for(j = 0 ; j < len ; j++)
            {
                for(k = 0 ; k < len ; k++)
                {
                    if(j != 0 && k != i)
                    {
                        Minor[c1][c2] = Matrix[j][k];
                        c2++;
                        if( c2 > len-2 )
                        {
                            c1++;
                            c2=0;
                        }
                    }
                }
            }

            temp = determinantC(Minor,len-1);
            det +=  ( Matrix[0][i] * temp) * O;

            O = -1 * O;
        }
    }

    return det;
}

main()
{
    cmplx **A= Create2DMatrixCmplx(1024, 1024);
    // set data to A
    cmplx det = determinantC( A, 1024 );
}

我在这行中收到了写入访问错误:

  

次要[c1] [c2] =矩阵[j] [k];

发生错误时,值为:

  

c1 = 337,c2 = 338,len = 974,

“次要”维度在每次迭代中都是len * len,而c1,c2值则更小。

所以我猜问题必须是指针。我在每次迭代中创建一个新的“cmplx ** Matrix”实例,但我用指针类型调用该函数。当我用指针调用它时,我是否获得了该对象的新实例?如果是这样,为什么之前的迭代没有问题? len在开头的价值是1024。

有人可以帮我找到问题吗?我看不到。

0 个答案:

没有答案