释放分配的内存(Valgrind 错误("Invalid read of size 8"))

Freeing allocated memory (Valgrind error ("Invalid read of size 8"))

新手在这里学习C。我正在尝试编写一个程序,为矩阵分配内存,扫描它,打印它,最后释放内存。它首先扫描行数和列数,然后为矩阵分配内存。然后它打印矩阵并最终释放内存。 (至少这是我打算做的)。看起来它正在工作并且输出与我预期的一样,但是当我使用 valgrind 运行 它时,它说“大小 8 的读取无效......在 'free matrix'”。我不明白为什么会这样。释放分配的内存时我做错了什么吗? (或其他地方?)。任何帮助深表感谢。我附上了代码。

#include<stdio.h>
#include<stdlib.h>

double** create_matrix(int, int);

void scan_matrix(double** ,int,int);

void free_matrix(double**,int);

void print_matrix(double** ,int,int);


int main(){

    int m,n;

    scanf("%d %d",&m,&n);

    double** A = create_matrix(m,n);

    scan_matrix(A,m,n);

    print_matrix(A,m,n);

    free_matrix(A,m);

    return 0;
}


double** create_matrix(int m, int n){

    double** matrix;
    //First allocate memory for storing all the rows of the matrix:
    matrix = (double**)malloc(m*sizeof(double*));

    //Check that memory could be allocated:
    if(matrix==NULL){
        printf("Memory could not be allocated for initial pointer\n");
    }

    //Then allocate memory for all the elements on each of the rows:
    for(int i= 0; i<m;i++){
       // *(matrix+i) = (double*) malloc(n*sizeof(double));
        *(matrix+i) = (double*) malloc(n*sizeof(double));
        if(*(matrix+i)==NULL){
            printf("Memory could not be allocated for row %d\n",i);
        }
    }

    return matrix;
}


/*
*matrix is a pointer to a pointer. m is the number of rows.
*/
void free_matrix(double** matrix,int m){

    //First free memory allocated for all the rows.
    for(int i= 0; i<m;i++){
        free(matrix+i);
    }
    //Then free the initial array pointer:
    free(matrix);

}


//Function for scanning matrix:
void scan_matrix(double** array,int rows, int cols){
    for(int i = 0; i<rows;i++){
        for(int j = 0; j<cols;j++){
            scanf("%lf",*(array+i)+j);
        }
    }
}

void print_matrix(double** matrix,int m, int n){
    for(int i= 0; i<m;i++){
        for(int j= 0; j<n;j++){
                printf("%10.2lf ",matrix[i][j]);
                if(j==n-1)
                    printf("\n");
        }
    }
}

正如kaylum所说,您需要将自由函数设为:free(matrix[i])

原因是当使用free时(在一个按你的方式分配的矩阵中)我们需要传递分配内存的行的具体地址。当您发送 matrix + i 时,您引用了整个矩阵的地址(例如,当 'i' 等于零时)而不是其中一行。