c -我一直得到一个segfault不知道为什么



这段代码是制作和打印矩阵出来,但我不知道为什么我得到segfault,这是因为我没有释放内存,如果是这样,我将如何释放它?

void printMatrix(struct Matrix *M){
struct Matrix *temp = M;
for(int i=0; i< temp->rows;i++){
for(int j=0; j< temp->cols;j++){
printf("%.f",getVal(temp,i,j));
}
printf("n");
}
}
void makeMatrix(struct Matrix *M, int row, int col, int num){
M = malloc(sizeof(struct Matrix));
M->rows=row;
M->cols=col;
M->m =malloc(100*sizeof(double)*M->rows*M->cols);
for(int i=0; i<M->rows;i++){
for(int j=0; j<M->cols;j++){
setVal(M,i,j,num);
}
}
free(M);
}
int  main(int argc, char const *argv[]) {
struct Matrix *test;
makeMatrix(test,10,10,10);
printMatrix(test);
return 0;
}

您的makeMatrix函数错误。参数M本地变量makeMatrix执行时。因此,对M的任何更改都是而不是函数结束时可见。当传递给printMatrix时,test没有初始化,导致失败,然后指针被解引用。

解决方案是按值从函数返回M

struct Matrix *makeMatrix(int row, int col, int num){
struct Matrix *M = malloc(sizeof(struct Matrix));
if (!M) return NULL;
M->rows=row;
M->cols=col;
M->m =malloc(100*sizeof(double)*M->rows*M->cols);
if (!M->m) {
free(M);
return NULL;
}
for(int i=0; i<M->rows;i++){
for(int j=0; j<M->cols;j++){
setVal(M,i,j,num);
}
}
return M;
}

用法:

struct Matrix *test = makeMatrix(10,10,10);

此外,malloc(100*sizeof(double)*M->rows*M->cols);看起来有点浪费,因为它消耗的内存比所需的多100倍。我很确定malloc(sizeof(double)*M->rows*M->cols);就足够了。

首先,必须始终检查malloc是否成功分配了内存。因此,在第一次调用malloc之后,您应该编写如下内容:


if(!M)
{
printf("malloc failed to allocate memory for M");
return;
}

等等。另外,您应该释放使用malloc分配的每个内存空间。在您的情况下,还应该设置free(M->m)

相关内容

  • 没有找到相关文章

最新更新