Не удается освободить 2D массив с помощью free in C


Я пытаюсь освободить матрицу, которую я создал в 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 2

3 ответа:

Попробуйте следующее

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

EDIT: еще одна ошибка:

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

Заголовок.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, '\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