我通过下面的代码为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]);
}你能帮帮我吗。提前谢谢。维吉塔
发布于 2013-06-22 22:59:22
您可以使用calloc进行最终分配(在double级别),而不是使用malloc,然后将这些值设置为0。
m=(double ***) malloc(nrh* sizeof(double***));行将为nrh元素分配空间,但是稍后使用for(i=0;i<=nrh;i++)进行迭代,它将迭代nrh + 1次。您需要更改对malloc或for的调用。
对于free,您需要:
适用于所有i的
free m[i][j]和适用于所有ifree m的j
free m[i]基本上,您应该始终为您的for语句添加赞誉。它有助于防止此类问题的发生。
另外,你真的需要交错数组和返回double***吗?你可以通过返回calloc( nrh * nch * nph, sizeof(double) )来做同样的事情,然后你可以通过调用free来释放它。
注意,关于calloc的部分可能并不总是适用于浮点值。但是,它应该始终应用于整型。
发布于 2013-06-23 00:46:38
你的代码中有3个问题:
在您的每个循环中,for
<而不是<=,并将费用代码中的递减循环j=nch-1,如注释中所述for(i=nrh;i>=0;i--){ for(j=nch;j>=0;j--) free((mi));free(mi);}
https://stackoverflow.com/questions/17251904
复制相似问题