C 动态 3D 阵列内存

肮脏

我有以下代码来动态创建二维数组。对于我的应用程序,我需要连续存储数据。

我想将下面的 2D 代码推广到 3D 数组。我怎样才能做到这一点?

double *psiMemLoc;
double **psi;

  psiMemLoc = malloc(sizeof(double)*(lasty-firsty+3)*(lastx-firstx+3));
  psi = malloc(sizeof(double *) * (lasty-firsty+3));
  for(j=firsty-1; j<=lasty+1; j++){
    psi[j] = psiMemLoc + (lastx-firstx+3)*j;
  }

使用上面的代码,我可以访问psilike 的元素psi[j][i]为了重申我的目标,我想生成一个 3D 数组,我可以使用psi[k][j][i].

为了给出一些上下文,我正在求解一个 2D PDE,第三维将用于存储一些先前的时间步解。所以时间步长之间的内存位置数量应该是(lasty-firsty+3)*(lastx-firstx+3).

谢谢!

用户2736738

您可以像这样获得 3d 连续分配的内存

double (*a)[sz][sz]= malloc(sizeof *a *sz);
if( a == NULL){
   // error in malloc
   exit(1);
}

这与你所做的有点不同。但它会为你的目的服务。

  for(size_t i=0;i<sz;i++)
    for(size_t j=0;j<sz;j++)
      for(size_t k=0;k<sz;k++)
         // access a[i][j][k]

释放将只是这样的调用free(a)(当你完成工作时释放内存)。

注意:这将适用于C99及以后。除此之外,C11 使 VLA 成为可选的,这打破了保证。但作为一种出路,您始终可以分配整个块并相应地访问它们。


另一种方法是使用锯齿状数组(不是连续内存)。

double ***a;

现在在一些函数中你这样做

a = malloc(sizeof *a* sz1);
if( a == NULL ){
   // ..
}
for(size_t i = 0; i<sz1; i++){
 a[i]= malloc(sizeof *a[i]*sz2);
 if( !a[i] ){
   for(size_t j = 0; j<sz2; j++)
     a[i][j]=malloc(sizeof *a[i][j]*sz3);
     if( a[i][j] == NULL){
      //error
     }
 }
 else
   // error
}
//If you have an jagged array a[sz1][sz2][sz3];

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章