请问有谁可以找到此代码的错误?我尝试创建一个函数来计算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;
}
答案 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;
}
感谢您的回答!