我试图取消使用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阵列?
提前致谢。
答案 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