为什么我的代码出现“双重释放或损坏(出)”错误? C语言

问题描述 投票:0回答:1

我将数组声明为 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);
    
}
c dynamic-memory-allocation
1个回答
0
投票

两个主要问题:

  1. 二维数组的不正确使用(损坏错误)
  2. 不正确释放内存(双重释放错误)

二维数组

二维数组占用内存的连续部分。指针数组和随后的 [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)。

© www.soinside.com 2019 - 2024. All rights reserved.