无法在 C 中使用空闲的 2D 数组释放



>im 试图使用 MatrizLibera(v) 对我在 MatrizCrea(n,m) 中创建的矩阵进行解置,但这两个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);
}

我应该如何解除分配 2D 阵列?

提前谢谢。

尝试以下操作

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中插入一个代码,用于检查内存是否已成功分配。

在你的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);

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);

正文.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, '', 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

最新更新