gpt4 book ai didi

c - 分配一个包含 3d 链表的结构体

转载 作者:行者123 更新时间:2023-11-30 16:56:47 25 4
gpt4 key购买 nike

我想实现一个简单的 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没问题的话。但事实并非如此:

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 *** 复杂结构,该结构通常会在尝试复制时导致内存损坏/内存泄漏另一个。

关于c - 分配一个包含 3d 链表的结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39811485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com