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、バッファ オーバーランの上の 2 番目のステートメントになります。これは未定義の動作であるため、クラッシュする場合としない場合があります。変化の原因は何でもあります。

于 2010-11-19T18:41:04.330 に答える
1

重大なメモリ リークがあります。dimensionループ内の補助行列時間にメモリを割り当てています。しかし、解放するのは一度だけです。割り当てロジックを変更して、割り当てを 1 回だけ実行します。

于 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 に答える