首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分配给3D矩阵的空闲内存

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

Stack Overflow用户
提问于 2013-06-22 22:39:56
回答 2查看 136关注 0票数 0

我通过下面的代码为3D矩阵分配内存。

代码语言:javascript
复制
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; 
}

但是,当我尝试使用下面的代码释放内存时,它不起作用

代码语言:javascript
复制
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]);
}

你能帮帮我吗。提前谢谢。维吉塔

EN

回答 2

Stack Overflow用户

发布于 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次。您需要更改对mallocfor的调用。

对于free,您需要:

适用于所有i的

  • free m[i][j]和适用于所有i
  • free m

的j

  • free m[i]

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

另外,你真的需要交错数组和返回double***吗?你可以通过返回calloc( nrh * nch * nph, sizeof(double) )来做同样的事情,然后你可以通过调用free来释放它。

注意,关于calloc的部分可能并不总是适用于浮点值。但是,它应该始终应用于整型。

票数 3
EN

Stack Overflow用户

发布于 2013-06-23 00:46:38

你的代码中有3个问题:

在您的每个循环中,for

  1. 关闭一个错误。对于递增循环使用<而不是<=,并将费用代码中的递减循环
  2. 错误括号范围的初始值设置为j=nch-1,如注释中所述

for(i=nrh;i>=0;i--){ for(j=nch;j>=0;j--) free((mi));free(mi);}

  • 你不会释放m
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17251904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档