我将数组声明为 float** 并使用 malloc 创建数组行数组声明。然后,我使用 malloc 在“for”循环中创建列。但是当我想释放它时,我收到了双重释放错误free command。
我尝试仅使用“free(matriz1)”,但这对我来说没有意义,因为我需要首先释放数组的行,然后释放变量本身。
这是一个高斯消元法代码。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void lerMatriz(int ROWS, int COLUNAS,float** matriz,FILE* file){
assert(file);
int linha=0;
while(!feof(file)){
if(ferror(file)){
printf("Error");
exit(1);
}
for(int i=0; i < COLUNAS;i++){
if(fscanf(file, "%f",&matriz[linha][i])==EOF)
break;
}
linha++;
if(linha==ROWS)
break;
}
}
void printMatriz(float** matriz,int ROWS,int COLUNAS){
for(int i=0;i<ROWS;i++){
for(int j=0;j<COLUNAS;j++)
printf("%g ",matriz[i][j]);
printf("\n");
}
}
void escalonar(float** matriz,int ROWS_A,int COLUNAS_A){
int j,i=0,n,k,m,l;
int linha_pivo=0;
for(j=0;j<COLUNAS_A;j++){
while(linha_pivo+i<ROWS_A && matriz[linha_pivo+i][j]==0){
i++;
}
if(linha_pivo+i<ROWS_A){
int aux= linha_pivo+i;
for(k=0;k<COLUNAS_A;k++){
double temp= matriz[linha_pivo][k];
matriz[linha_pivo][k]=matriz[aux][k];
matriz[aux][k]=temp;
}
for(m=linha_pivo+1;m<ROWS_A;m++){
double c= matriz[m][j] / matriz[linha_pivo][j];
for(n=0;n<COLUNAS_A;n++){
matriz[m][n]+= -c * matriz[linha_pivo][n];
}
}
linha_pivo++;
}
i=0;
}
for(int i=0;i<ROWS_A;i++){
for(int j=0;j<COLUNAS_A;j++)
if(matriz[i][j]<=0.000001 && matriz[i][j]>=-0.000001)
matriz[i][j]=0;
}
printMatriz(matriz,ROWS_A,COLUNAS_A); // Imprimir a matriz escalonada
}
int main(){
FILE* file;
int ROWS_A,COLUNAS_A;
// Leitura das dimensões da matriz A
puts("Linha da matriz A:");
scanf("%d",&ROWS_A);
puts("Coluna da matriz A:");
scanf("%d",&COLUNAS_A);
float** matriz1= malloc(ROWS_A*sizeof(float*));
for(int i=0;i<COLUNAS_A;i++)
matriz1[i]=malloc(COLUNAS_A*sizeof(float));
file = fopen("matriz1.txt","r");
lerMatriz(ROWS_A,COLUNAS_A,matriz1,file);
fclose(file);
puts("Escalonamento da matriz1:");
escalonar(matriz1,ROWS_A,COLUNAS_A);
for(int i=0;i<ROWS_A;i++){
free (matriz1[i]);
}
free (matriz1);
}
二维数组占用内存的连续部分。指针数组和随后的 [n] 个浮点数组的分配不是二维数组。
结构中项目的正确寻址:
float **matriz1; float *items_in_row = matriz1[row]; float item = items_in_row[col];
内存分配(COLUNAS_A的数量):
float** matriz1= malloc(ROWS_A*sizeof(float*)); for(int i=0;i<COLUNAS_A;i++) matriz1[i]=malloc(COLUNAS_A*sizeof(float));
释放内存(ROWS_A的数量):
for(int i=0;i<ROWS_A;i++){ free (matriz1[i]); } free (matriz1);
分配和释放的项目数量应该相同(在您的情况下为ROWS_A)。