>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