gpt4 book ai didi

C 代码未定义行为 - 在 func 中重新分配结构

转载 作者:行者123 更新时间:2023-12-01 09:18:39 25 4
gpt4 key购买 nike

作为非 C 语言专家,我敢于开始编写代码。代码的初步版本按预期工作(当符合 gcc -lm 时)。但是,当我试图使用编译器的 -fopenmp 选项编译它时,因为我想让代码的某些部分并行,代码崩溃 - 段错误。我想强调的是,我还没有引入任何编译指示——我只是使用 -fopenmp 选项进行编译,代码崩溃了。但是,当我尝试在不同的 Linux 机器上运行此代码时 - 它有效。

我尝试使用调试器查看代码的哪个位置发生了段错误。当我尝试重新分配函数中先前在 main () 中分配的结构时,问题似乎开始了。

结构如下:

typedef struct 
{
Bond bond; // structure bond
int f; // the lenghth of the fragment
int *fragment;
} Fragment;

首先,我在main()中分配了它并传递给函数:

Fragment fragments3[NBONDS];
for (i=0;i<NBONDS;i++) {
fragments3[i].fragment = malloc (1*sizeof(int));
fragments3[i].f = 0;
fragments3[i].bond = bonds[i];
}
// to fill up the allocated fragments with the values
fragmentation(coordinates, NATOMS, NBONDS, bonds, fragments3);

然后当我开始在函数碎片中使用这个分配的结构数组时,发生了段错误:

void fragmentation(Atom *coordinates, int NATOMS, int NBONDS, Bond *bonds, Fragment *fragments3) {

int mm, i, ll, j;
for (mm=0;mm<NBONDS;mm++) {
(fragments3)[mm].bond.atom1 = bonds[mm].atom1; (fragments3)[mm].bond.atom1 = bonds[mm].atom1;
for (i=0;i<coordinates[bonds[mm].atom1-1].nn;i++) {
if (coordinates[bonds[mm].atom1-1].n[i] != bonds[mm].atom2) {
(fragments3)[mm].fragment[(fragments3)[mm].f]= coordinates[bonds[mm].atom1-1].n[i];
(fragments3)[mm].f= (fragments3)[mm].f + 1;
(fragments3)[mm].fragment = (int *) realloc( (fragments3)[mm].fragment, ((fragments3)[mm].f+1)*sizeof(int) ) ;

}
}
}
.......
}

任何提示或建议都会有所帮助。我必须强调,当我在 main 中分配时会发生同样的崩溃:

Fragment **fragments3 = malloc(NBONDS * sizeof (*fragments3));
...
fragmentation(coordinates, NATOMS, NBONDS, bonds, &fragments3);

并在函数中使用它:

(*fragments3).f = ...

是的,当然,这些是结构:

typedef struct {
char El[3];
double xyz[3];
int t;
int n[23];
int nn;
} Atom;

typedef struct {
int atom1;
int atom2;
int angle;
} Bond;

我主要通过以下方式启动它们:

Atom *coordinates = malloc(1 * sizeof *coordinates);
Bond *bonds = malloc(1*sizeof *bonds);

(稍后这些通过函数填充)

最佳答案

在按照建议检查每个 malloc 分配时,我在代码中发现了一个错误。问题出在结构坐标中,即在 coordinates.n 中,关键是我用这个变量进行计数:coordinates.n++。因为我没有在开头输入 0,所以我得到了一些奇怪的数字,整个事情就出错了。

但为了得到它我必须检查 1000 行代码..

再次感谢!

关于C 代码未定义行为 - 在 func 中重新分配结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32371211/

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