C代码未定义的行为 - func中struct的realloc

时间:2015-09-03 08:57:43

标签: c realloc

作为非编码的专家,我敢于开始编写代码。代码的初步版本按预期工作(当符合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);

(以后这些是通过功能填写的)

1 个答案:

答案 0 :(得分:0)

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

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

再次感谢你!