2016-10-01 80 views
0

我想要实现一个简单的N体仿真,并管理所有我想使用链表的相互作用来计算邻居之间的交互。这是代码:分配一个包含3d链接列表的结构

#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)中的程序工作正常,但如果参数中稍大一点时,我执行程序,我发现一个分段错误错误。有人告诉我我做错了什么吗?

在此先感谢!

+0

typpo here:'simulation> nc [1]' –

+1

仅供您参考,被称为[三星程序员](http://c2.com/cgi/wiki?ThreeStarProgrammer)通常不是*赞美。 –

+1

Do * NOT *施放'malloc'的返回值,这是不必要的。请参阅:[**我是否将malloc的结果?**](http://stackoverflow.com/q/605845/995714)进行了详细说明。 –

回答

0

通过调试器崩溃的

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

运行有什么不妥malloc的,所以这个问题必须来自前面的指令,这似乎很好,好,那是,如果以前malloc是OK。但它不是:

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

宾果:sizeof(simulation)应该sizeof(simulation_struct)或没有足够的MEM的结构(simulation是一个指针,大小4或8,...):破坏内存。

修正:

simulation = malloc(sizeof(simulation_struct)); 

我测试了固定的版本,它不会再崩溃。

注意:因为​​很小,所以应该更好避免分配它,并且使用&返回一个​​:开销略多,但少一个malloc。

和C++ & vector还是不错的基质模板也能解决您的node ***复杂的结构,试图复制一个在另一个时,通常会导致内存崩溃/内存泄漏。