2016-10-01 78 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 ***複雜的結構,試圖複製一個在另一個時,通常會導致內存崩潰/內存泄漏。