我通过以下代码为3D矩阵分配内存。
double ***AllocMatrix3(short nrh, short nch, short nph)
{
short i,j,k;
double ***m;
m=(double ***) malloc(nrh* sizeof(double***));
for(i=0;i<=nrh;i++) {
m[i]=(double **) malloc(nch*sizeof(double*));
for (j=0;j<=nch;j++){
m[i][j]=(double*) malloc(nph*sizeof(double));
}
}
for(k=0;k<=nph;k++)
for(i=0;i<=nrh;i++)
for(j=0;j<=nch;j++)
m[i][j][k] = 0.0;
return m;
}
但是当我尝试使用下面的代码释放内存时,它无法正常工作
void FreeMatrix3(double ***m,short nrl,short nrh,
short ncl,short nch, short npl,short nph)
{
short i,j,k;
for(i=nrh;i>=0;i--)
for(j=nch;j>=0;j--)
free((m[i][j]));
free(m[i]);
}
你能帮忙吗?
提前致谢。
Vijitha
答案 0 :(得分:3)
您可以使用malloc
进行最终分配(0
级别),而不是使用calloc
并稍后将值设置为double
。
行m=(double ***) malloc(nrh* sizeof(double***));
将为nrh
元素分配空间,但您稍后会使用for(i=0;i<=nrh;i++)
进行迭代,这会迭代nrh + 1
次。
您需要将通话更改为malloc
或for
。
对于free
,您需要:
free
m[i][j]
free
m[i]
free
m
基本上,您应该始终为for
语句添加赞誉。它有助于防止此类问题。
另外,你真的需要锯齿状数组并返回double***
吗?您可以通过返回calloc( nrh * nch * nph, sizeof(double) )
来完成同样的事情,然后只需拨打一次free
即可免费。
警告,关于calloc
的部分可能并不总是适用于浮点值。它应该始终适用于整数类型。
答案 1 :(得分:1)
您的代码中存在3个问题:
在每个for循环中出现一个错误。使用<
代替<=
进行递增循环,并为递减循环将初始值设置为j=nch-1
评论中提到的费用代码中的支撑范围
for(i=nrh;i>=0;i--){
for(j=nch;j>=0;j--)
free((m[i][j]));
free(m[i]);
}
你自己不自由