0

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

你能帮忙吗?提前致谢。维吉塔

4

2 回答 2

3

而不是使用malloc和稍后将值设置为0您可以calloc用于最终分配(在double级别)。

该行将为元素m=(double ***) malloc(nrh* sizeof(double***));分配空间,但您稍后会使用which 迭代次数进行迭代。您需要将呼叫更改为或。nrhfor(i=0;i<=nrh;i++)nrh + 1mallocfor

对于free,您需要:

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

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

另外,你真的需要锯齿状数组并返回double***吗?您可以通过返回来完成同样的事情,calloc( nrh * nch * nph, sizeof(double) )然后只需调用free.

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

于 2013-06-22T14:59:21.660 回答
1

您的代码中有 3 个问题:

  1. 在您拥有的每个 for 循环中出现一个错误。使用<in 而不是<=递增循环并将初始值设置j=nch-1为递减循环

  2. 如评论中所述,费用代码中的错误大括号范围

    for(i=nrh;i>=0;i--){
        for(j=nch;j>=0;j--) 
            free((m[i][j]));
        free(m[i]);
    }
    
  3. 你没有释放 m 本身

于 2013-06-22T16:46:38.287 回答