无法在C中释放带有free的2D数组

时间:2015-04-11 18:46:00

标签: c arrays types free dealloc

我试图取消使用MatrizCrea(n,m)MatrizLibera(v)中创建的矩阵,但是free()都告诉我存在类型冲突。

我已经按照severa来源完成了这段代码,因此我不太清楚为什么会出现这种错误。

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阵列?

提前致谢。

3 个答案:

答案 0 :(得分:1)

尝试以下

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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, '\0', 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