分配一个结构体,其中包含一个3d链表



我想实现一个简单的n体模拟,并管理所有的成对交互,我想使用链表来计算邻居之间的交互。这是代码:

#include <stdio.h>
#include <stdlib.h>
#define V 20
#define N_P 100
typedef struct _node{
  int id;
  struct _node *next;
} node;
typedef struct _particle{
  double r[3];
  node* n;
  int coor[3];
} particle;
typedef struct _simulation_struct{
  int N;
  particle *system;
  double L[3];
  double s[3];
  int nc[3];
  node*** cell;
} simulation_struct;
  simulation_struct *new_simulation(int N, double Lx, double Ly,double Lz,double R);
int main()
{
  simulation_struct *simulation=new_simulation(N_P,V,V,V,2);
  return 0;
}
simulation_struct *new_simulation(int N, double Lx, double Ly, double Lz,double R)
{
  simulation_struct *simulation;
  int i, j,k;
  simulation =(simulation_struct*) malloc(1*sizeof(simulation));
  simulation->N = N;
  simulation->L[0] = Lx;
  simulation->L[1] = Ly;
  simulation->L[2] = Lz;
  simulation->nc[0] = (int) (Lx/R)+1;
  simulation->nc[1] = (int) (Lx/R)+1;
  simulation->nc[2] = (int) (Lx/R)+1;
  simulation->s[0] = Lx/simulation->nc[0];
  simulation->s[1] = Ly/simulation->nc[1];
  simulation->s[2] = Lz/simulation->nc[2];
  simulation->system = (particle*)malloc(N*sizeof(particle));
  simulation->cell =(node***) malloc ((simulation->nc[0])*sizeof(node **));
  for (i=0; i < simulation->nc[0]; i++)
  {
    simulation->cell[i] = (node**)malloc((simulation >nc[1])*sizeof(node*));
    for (j=0; j < simulation->nc[1];j++)
    {
        simulation->cell[i][j] = (node*)malloc((simulation->nc[2])*sizeof(node));
        for (k=0; k < simulation->nc[2];k++)
        {
           simulation->cell[i][j][k].id = -1;
           simulation->cell[i][j][k].next = NULL;
        }
    }
  }
   for (i=0; i < simulation->nc[0]; i++)
   {
      simulation->system[i].n = (node*)malloc(1*sizeof(node));
      simulation->system[i].n->id = i;
   }
   return simulation;
}

我可以编译它,如果参数V和N_P很小(例如V=10 N_P=20),程序工作正常,但如果参数稍大一点,当我执行程序时,我发现一个分段错误。谁能告诉我我哪里做错了?

提前感谢!!!!

通过调试器运行时会崩溃

simulation->system = (particle*)malloc(N*sizeof(particle));

这个malloc没有问题,所以问题一定是来自之前的指令,看起来很好,嗯,那是如果之前的malloc是OK的。但它不是:

simulation =(simulation_struct*) malloc(1*sizeof(simulation));

Bingo: sizeof(simulation)应该是sizeof(simulation_struct)或者没有足够的内存用于结构(simulation是一个指针,大小为4或8,…):内存损坏

固定:

simulation = malloc(sizeof(simulation_struct));

我测试了修复版本,它不再崩溃了。

注意:由于simulation_struct很小,最好避免分配,而使用&返回一个simulation_struct:稍微多一点开销,但是少一个malloc。

和c++ &vector或好的矩阵模板也可以修复你的node ***复杂的结构,通常导致内存损坏/内存泄漏时,试图复制一个在另一个。

最新更新