分配给3D矩阵的空闲内存

时间:2013-06-22 14:39:56

标签: c memory-management

我通过以下代码为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

2 个答案:

答案 0 :(得分:3)

您可以使用malloc进行最终分配(0级别),而不是使用calloc并稍后将值设置为double

m=(double ***) malloc(nrh* sizeof(double***));将为nrh元素分配空间,但您稍后会使用for(i=0;i<=nrh;i++)进行迭代,这会迭代nrh + 1次。 您需要将通话更改为mallocfor

对于free,您需要:

    所有i和j
  • free m[i][j]
  • 所有我
  • free m[i]
  • free m

基本上,您应该始终为for语句添加赞誉。它有助于防止此类问题。

另外,你真的需要锯齿状数组并返回double***吗?您可以通过返回calloc( nrh * nch * nph, sizeof(double) )来完成同样的事情,然后只需拨打一次free即可免费。

警告,关于calloc的部分可能并不总是适用于浮点值。它应该始终适用于整数类型。

答案 1 :(得分:1)

您的代码中存在3个问题:

  1. 在每个for循环中出现一个错误。使用<代替<=进行递增循环,并为递减循环将初始值设置为j=nch-1

  2. 评论中提到的费用代码中的支撑范围

    for(i=nrh;i>=0;i--){
        for(j=nch;j>=0;j--) 
            free((m[i][j]));
        free(m[i]);
    }
    
  3. 你自己不自由