Не удается освободить 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 ответа:
Попробуйте следующее
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