释放分配的内存(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' 等于零时)而不是其中一行。
新手在这里学习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' 等于零时)而不是其中一行。