无法在 C 中使用 free 释放二维数组
Can't deallocate 2D array with free in C
我正在尝试释放我在 MatrizCrea(n,m)
中使用 MatrizLibera(v)
创建的 Matrix,但是两个 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);
}
我应该如何解除分配二维数组?
提前致谢。
在您的 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);
尝试以下方法
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
中插入一段代码,检查内存是否分配成功。
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, '[=11=]', 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
我正在尝试释放我在 MatrizCrea(n,m)
中使用 MatrizLibera(v)
创建的 Matrix,但是两个 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);
}
我应该如何解除分配二维数组?
提前致谢。
在您的 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);
尝试以下方法
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
中插入一段代码,检查内存是否分配成功。
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, '[=11=]', 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