繁体   English   中英

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

[英]C code undefined behaviour - realloc of struct in func

作为非编码的专家,我敢于开始编写代码。 代码的初步版本按预期工作(当符合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 ++。 由于我在开头没有输入0,所以我得到了一些奇怪的数字,整个事情出错了。

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

再次感谢你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM