wol*_*k88 6 c segmentation-fault
我在返回语句之前打印我正在返回的值,并告诉我的代码打印函数调用后立即返回的值.但是,在我的第一个print语句之后和第二个print语句之前,我得到了一个分段错误(也有趣的是,这总是在第三次调用函数时发生;从不是第一次或第二次,从不第四次或更晚).我尝试打印出我正在处理的所有数据,看看我的其余代码是否正在做一些它可能不应该做的事情,但到目前为止我的数据看起来很好.这是功能:
int findHydrogen(struct Amino* amino, int nPos, float* diff, int totRead) {
    struct Atom* atoms;
    int* bonds;
    int numBonds;
    int i;
    int retVal;
    int numAtoms;
    numAtoms = (*amino).numAtoms;
    atoms = (struct Atom *) malloc(sizeof(struct Atom) * numAtoms);
    atoms = (*amino).atoms;
    numBonds = atoms[nPos].numBonds;
    bonds = (int *) malloc(sizeof(int) * numBonds);
    bonds = atoms[nPos].bonds;
    for(i = 0; i < (*amino).numAtoms; i++)
        printf("ATOM\t\t%d  %s\t0001\t%f\t%f\t%f\n", i + 1, atoms[i].type, atoms[i].x, atoms[i].y, atoms[i].z);
    for(i = 0; i < numBonds; i++) 
        if(atoms[bonds[i] - totRead].type[0] == 'H') {
            diff[0] = atoms[bonds[i] - totRead].x - atoms[nPos].x;
            diff[1] = atoms[bonds[i] - totRead].y - atoms[nPos].y;
            diff[2] = atoms[bonds[i] - totRead].z - atoms[nPos].z;
            retVal = bonds[i] - totRead;
            bonds = (int *) malloc(sizeof(int));
            free(bonds);
            atoms = (struct Atom *) malloc(sizeof(struct Atom));
            free(atoms);
            printf("2 %d\n", retVal);
            return retVal;
        }
}
正如我之前提到的,它在前两次运行时运行良好,第三次打印正确的retVal值,然后在它到达我调用函数的位置之前在某处出现seg故障,我这样做:
hPos = findHydrogen((&aminoAcid[i]), nPos, diff, totRead);
printf("%d\n", hPos);
Ran*_*tor 10
返回时的分段错误通常表示存在损坏的堆栈.
从这段代码猜测错误的位置并不容易(这里几乎每行代码都有漏洞可能存在) - 可能你的某个地方有一个缓冲区溢出,但是如果你在*nix上运行你的程序valgrind,你应该能够很快找到错误.
这些线看起来很奇怪:
atoms = (struct Atom *) malloc(sizeof(struct Atom) * numAtoms);
atoms = (*amino).atoms;
当你丢弃malloc返回的指针时,你正在泄漏内存.用同样的事bonds,和你的循环中一遍又一遍同样的事情.
编辑嗯,你左右都在泄漏记忆,但不像我想的那样.固定顺序如下:
具体来说,当你这样做时:
atoms = (struct Atom *) malloc(sizeof(struct Atom) * numAtoms); // 1
atoms = (*amino).atoms; // 2
// ...
atoms = (struct Atom *) malloc(sizeof(struct Atom)); // 3
free(atoms); // 4
发生的事情是你正在分配一些内存并atoms在步骤(1)中输入地址.然后,你抛弃该地址,而是指向(2)中结构atoms内部的一部分amino.然后你用一个原子分配第二个指针.最后,你呼吁free.你bonds以同样的方式对待.你可能意味着这样的事情:
atoms = (struct Atom *) malloc(sizeof(struct Atom) * numAtoms); // 1
memcpy(atoms, (*amino).atoms, sizeof(struct Atom) * numAtoms); // 2
// ...
// delete 3
free(atoms); // 4
请注意,如果Atom有任何指针组件,您可能需要执行for循环并单独复制原子及其内容,然后您必须free在返回点单独复制它们.
...或者如果您只想从结构中读取原子数据,可能就是这样:
atoms = (*amino).atoms; // delete 1, 3, 4 entirely and just read directly from the structure
关于空间数量diff和其他问题的其他答案可能也值得研究.
编辑:修复调用序列以匹配代码示例.