无法在 C 中使用 free 释放二维数组

Can't deallocate 2D array with free in C

我正在尝试释放我在 MatrizCrea(n,m) 中使用 MatrizLibera(v) 创建的 Matrix,但是两个 free() 都告诉我存在类型冲突。

我已经根据多个来源完成了此代码,所以我不太确定为什么会发生此错误。

header.h

typedef struct Matriz {int n, m, **d;} Matriz;

Matriz MatrizCrea(int n, int m);
void MatrizLibera(Matriz v);



body.c

Matriz MatrizCrea(int n, int m) {
    Matriz mat;
    mat.n = n;
    mat.m = m;

    int ** val = (int*)malloc(n*sizeof(int*));
    int i = 0;
    for (; i<n;i++) {
        val[i] = (int*)malloc(m*sizeof(int*));
    }

    mat.d = val;
    return mat;
}

void MatrizLibera(Matriz v) {
    int i = 0;
    for (; i<v.n; i++) {
        int *a = v.d[i];
        free(a);
    }
    free(v);
}

我应该如何解除分配二维数组?

提前致谢。

在您的 MatrizCrea 中,您在第二个 malloc 中出错: 这个

for (; i<n;i++) {
        val[i] = (int*)malloc(m*sizeof(int*));
    }

你的 sizeof 应该是 int 而不是 int 指针

编辑:另一个错误:

   int ** val = (int*)malloc(n*sizeof(int*));

类型不匹配应该是:

    int ** val = (int**) malloc(n*sizeof(int*));

对于解除分配我会使用:

for(i = 0; i < v.n ; i++) {
    free(v[i]);
}
free(v);

尝试以下方法

Matriz MatrizCrea( int n, int m ) 
{
    Matriz mat;

    mat.n = n;
    mat.m = m;

    mat.d = malloc( n * sizeof( int* ) );

    int i = 0;
    for ( ; i < n; i++ ) 
    {
        mat.d[i] = malloc( m * sizeof( int ) );
    }

    return mat;
}

void MatrizLibera( Matriz *mat ) 
{
    if ( mat->d != NULL )
    {
        int i = 0;
        for ( ; i < mat->n; i++ ) 
        {
            free( mat->d[i] );
        }

        free( mat->d );

        mat->d = NULL;
        mat->n = 0;
        mat->m = 0;
    }
}

您也可以在函数MatrizCrea中插入一段代码,检查内存是否分配成功。

header.h

// dont typedef struct definitions
struct Matriz {int n, m, **d;};

// pass and return pointers
struct Matriz* MatrizCrea(int n, int m);
void MatrizLibera(struct Matriz* v);

body.c

struct Matriz* MatrizCrea(int n, int m) 
{
    // indent code blocks
    struct Matriz* mat = malloc( sizeof struct Matriz );
    if (NULL == mat )
    {
        perror( "malloc for matrix struct failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    mat->n = n;
    mat->m = m;

    if( NULL == (mat->d = malloc(n*sizeof(int*)) )
    {
        perror( "malloc for d failed" );
        free(mat);
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    memset( mat->d, '[=11=]', n*sizeof(int)); 

    int i = 0;
    for (; i<n;i++) 
    {
        if( NULL == (mat->d[i] = malloc(m*sizeof(int)) )
        {
            perror( "malloc for d[x] failed" );
            for(i = 0; i < m; i++ ) { free(mat->d[i]); }
            free( mat->d );
            free( mat );
            exit( EXIT_FAILURE );
        }

        // implied else, malloc successful
    } // end for
    return mat;
} // end function: MatrizCrea



void MatrizLibera(struct Matriz* v) 
{
    int i = 0;
    for (; i<v->n; i++) 
    {
        free( v->d[i]);
    }
    free( v->d );

    free(v);
} // end function: MatrizLibera