1

请问有人能找到这个代码的错误吗?我尝试创建一个函数来计算矩阵 nXn 的行列式。该程序正常运行,但发生了“清醒”的事情。我声明了“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

4 回答 4

2

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

于 2010-11-19T18:40:24.663 回答
2
*(matriz_aux + j) = (int*) malloc( cont * sizeof(int));
/*...*/
*(*(matriz_aux + j) + aux) = *(*(matriz + 1) + k);

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

于 2010-11-19T18:41:04.330 回答
1

你有一个严重的内存泄漏。您正在为dimension循环内的辅助矩阵时间分配内存。但是你只释放它一次。将您的分配逻辑更改为只进行一次分配。

于 2010-11-19T19:43:32.600 回答
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;
}

感谢您的回答!

于 2010-11-19T20:04:56.287 回答