分配一个包含 3d 链表的结构
Allocate a struct which includes a 3d linked list
我想实现一个简单的 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)程序运行正常,但如果参数稍微大一点当我执行程序时,我发现了一个分段错误 error.Could 有人告诉我我做错了什么吗?
提前致谢!!!
运行 通过调试器在
上崩溃
simulation->system = (particle*)malloc(N*sizeof(particle));
那个malloc
没问题,所以问题肯定出在前面的说明上,好像没问题,嗯,就是如果前面的malloc
没问题。但它不是:
simulation =(simulation_struct*) malloc(1*sizeof(simulation));
Bingo:sizeof(simulation)
应该是 sizeof(simulation_struct)
或结构没有足够的内存(simulation
是一个指针,大小为 4 或 8,...):损坏的内存。
固定:
simulation = malloc(sizeof(simulation_struct));
我测试了固定版本,它不再崩溃了。
注意:simulation_struct
小,最好不要分配,使用&returna simulation_struct
:稍微多一点开销,少一个malloc。
并且 C++ 和 vector
或好的矩阵模板也可以修复您的 node ***
复杂结构,这种结构通常会在尝试将一个复制到另一个时导致内存 corruption/memory 泄漏。
我想实现一个简单的 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)程序运行正常,但如果参数稍微大一点当我执行程序时,我发现了一个分段错误 error.Could 有人告诉我我做错了什么吗?
提前致谢!!!
运行 通过调试器在
上崩溃simulation->system = (particle*)malloc(N*sizeof(particle));
那个malloc
没问题,所以问题肯定出在前面的说明上,好像没问题,嗯,就是如果前面的malloc
没问题。但它不是:
simulation =(simulation_struct*) malloc(1*sizeof(simulation));
Bingo:sizeof(simulation)
应该是 sizeof(simulation_struct)
或结构没有足够的内存(simulation
是一个指针,大小为 4 或 8,...):损坏的内存。
固定:
simulation = malloc(sizeof(simulation_struct));
我测试了固定版本,它不再崩溃了。
注意:simulation_struct
小,最好不要分配,使用&returna simulation_struct
:稍微多一点开销,少一个malloc。
并且 C++ 和 vector
或好的矩阵模板也可以修复您的 node ***
复杂结构,这种结构通常会在尝试将一个复制到另一个时导致内存 corruption/memory 泄漏。