返回语句之前/期间的C分段错误

前端之家收集整理的这篇文章主要介绍了返回语句之前/期间的C分段错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在返回语句之前打印我正在返回的值,并告诉我的代码打印函数调用后立即返回的值.但是,在我的第一个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);

解决方法

从这段代码猜测错误的位置并不容易(这里几乎每行代码都有漏洞可能存在) – 可能你的某个地方有一个缓冲区溢出,但是如果你在* nix上运行你的程序 valgrind,你应该能够很快找到错误.

这些线看起来很奇怪:

atoms = (struct Atom *) malloc(sizeof(struct Atom) * numAtoms);
atoms = (*amino).atoms;

当你丢弃malloc返回的指针时,你正在泄漏内存.债券也是如此,在你的for循环中再次发生同样的事情.

猜你在找的C&C++相关文章