最奇怪的错误发现有一个递归程序来计算矩阵的行列式

时间:2010-11-19 18:31:21

标签: c recursion dynamic-memory-allocation

请问有谁可以找到此代码的错误?我尝试创建一个函数来计算matriz nXn的行列式。该程序正常运行,但发生了'sobrenatural'的事情。我声明'char'类型的变量'ch',我不再需要它了。但是,如果我删除此变量,则会发生执行错误。为什么呢?

/*the function 'pot' calculate a integer pow of a integer*/
int determinante( int** matriz , int dimensao ){
    char cc;/*remove this variable and execute the code. On my PC a error occurr*/
    int cont = dimensao;
    int det = 0;
    int i, j, k, aux;
    int** matriz_aux;
    if( cont > 1 ){
        cont --;
        for( i = 0; i < dimensao; i++){
            matriz_aux = (int**) malloc( cont * sizeof(int*));
            if( matriz_aux == NULL ){
                printf("ERRO!\n");
                exit(-3);
            }
            for( j = 0; j < cont; j++){
                *(matriz_aux + j) = (int*) malloc( cont * sizeof(int));
                if(*(matriz_aux + j) == NULL){
                    printf("ERRO!\n");
                    exit(-4);
                }
            }
            for( j = 0; j < cont; j++){
                    for(k = 0, aux = 0; k < dimensao; k++){
                        printf("Aqui\n");
                        if( i != k ){
                            printf(" i = %d\n", i);

                            /*I forgive to add 'j' in '*(*(matriz + 1 + j) + k ). Now  it works but the bug stay here*/

                            *(*(matriz_aux + j) + aux) = *(*(matriz + 1 + j) + k);
                            aux++;
                        }
                    }
            }
            det += matriz[0][i]*pot( -1, i)*determinante(matriz_aux, cont);
        }
    }
    else {
        det += matriz[0][0];
    }

    for( i = 0; i < cont; i++){
        free( matriz_aux[i] );
    }
    free( matriz_aux );
    //printf(" determinant value = %d\n", det);
    return det;
}

4 个答案:

答案 0 :(得分:2)

错误是什么?如果删除该变量会导致问题,那么您可能会溢出堆栈。尝试在函数开头将其设置为0xAB之类的值,然后在结尾处将其打印出来。如果它发生了变化,你的代码就会出现问题。

答案 1 :(得分:2)

*(matriz_aux + j) = (int*) malloc( cont * sizeof(int));
/*...*/
*(*(matriz_aux + j) + aux) = *(*(matriz + 1) + k);

aux可以等于cont,这使得第二个语句高于缓冲区溢出。这是未定义的行为,因此它可能会也可能不会崩溃。任何事情都可能导致变化。

答案 2 :(得分:1)

您有重大内存泄漏。你在循环中为辅助矩阵dimension次分配内存。但是你只能解放一次。将分配逻辑更改为仅进行一次分配。

答案 3 :(得分:0)

我发现了问题。可能在代码的最后使用free。我正在尝试免费的非分配内存。正确的代码是:

int determinante( int** matriz , int dimensao ){
    int cont = dimensao;
    int det = 0;
    int i, j, k, aux;
    int** matriz_aux;
    if( cont > 1 ){
        cont --;
        for( i = 0; i < dimensao; i++){
            printf(" i inicial = %d\n", i);
            matriz_aux = (int**) malloc( cont * sizeof(int*));
            if( matriz_aux == NULL ){
                printf("ERRO!\n");
                exit(-3);
            }
            for( j = 0; j < cont; j++){
                *(matriz_aux + j) = (int*) malloc( cont * sizeof(int));
                if(*(matriz_aux + j) == NULL){
                    printf("ERRO!\n");
                    exit(-4);
                }
            }
            for( j = 0; j < cont; j++){
                    for(k = 0, aux = 0; k < dimensao; k++){
                        if( i != k ){
                            printf("valor de i = %d\n", i);
                            *(*(matriz_aux + j) + aux) = *(*(matriz + j + 1) + k);
                            aux++;
                        }
                    }
            }
            det += matriz[0][i]*pot( -1, i)*determinante(matriz_aux, cont);
        }
        /*Is here that shoud be free 'matriz_aux'*/
        for( i = 0; i < cont; i++){
            free( matriz_aux[i] );
        }
        free( matriz_aux );
    }
    else {
        det += matriz[0][0];
    }

    /*for( i = 0; i < cont; i++){
        free( matriz_aux[i] );
    }
    free( matriz_aux );*/
    return det;
}

/*here is the function 'pot'*/


int pot(int x , int y){
    int result;
    if( y == 0 ){//base case
       result = 1;
    }
    else if( y > 0 ){
        result =  x*pot( x , y-1 );//inductive step
    }
    else if( x == 0 ){
        printf("ERRO!\n");
        exit(-1);
    }
    return result;
}

感谢您的回答!