在最后一行代码上出现段错误

use*_*353 3 c segmentation-fault

我希望实施一个简单的分子动力学计划.我的第一步是将系统定义为一系列原子,每个原子都有一个类型,一个id号,一个​​三维位置矢量和一个3D速度矢量.以下是我写的程序:

FILE *init;

static int randomVelocity(void)  
{  
     return rand()/RAND_MAX - 0.5;  
}  


int main(int argc, char *argv[])  
{  

    int iType;  
    int iID;  
    int i;  
    double* pdPosition;  
    double* pdVelocity;  
    char* line;  
    Atom* poAtoms;  
    int count = 0;  

    init = fopen("newdat.txt", "r+");  
    srand((unsigned)time(NULL));  
    line = malloc(81*sizeof(char));  
    while (fgets(line, 80, init) != NULL)    
    {  
         char* tok1;  
         char* tok2;  
         char* tok3;  
         char* tok4;  
         tok1 = strtok(line, " \t");  
         if ((tok1 == NULL) || (tok1[0] == '*'))   
         {  
              break;  
         }  
         tok2 = strtok(NULL, " \t");  
         tok3 = strtok(NULL, " \t");  
         tok4 = strtok(NULL, " \t");  
         iType = atoi(tok1);  
         iID = count;  
         pdPosition = (double*)malloc(3*sizeof(double));  
         pdVelocity = (double*)malloc(3*sizeof(double));     
         pdPosition[0] = atof(tok2);  
         pdPosition[1] = atof(tok3);  
         pdPosition[2] = atof(tok4);  
         pdVelocity[0] = randomVelocity();  
         pdVelocity[1] = randomVelocity();    
         pdVelocity[2] = randomVelocity();  
         poAtoms[count] = Atom_new(iType, iID, pdPosition, pdVelocity);  
         count++;  
    }  

    for (i = 0; i < count; i++)  
    {  
         Atom_print(poAtoms[i]);  
         Atom_free(poAtoms[i]);  
    }   

    free(line);  
    return 0;  
}
Run Code Online (Sandbox Code Playgroud)

这是头文件atom.h:

/**** atom.h ****/


typedef struct Atom_str *Atom;  

Atom Atom_new(int iType, int iID, double* adPosition, double* adVelocity);  

void Atom_free(Atom oAtom);  

void Atom_print(Atom oAtom);  
Run Code Online (Sandbox Code Playgroud)

和测试输入文件:

1 5 7 9  
2 12 13 14  
Run Code Online (Sandbox Code Playgroud)

程序编译,但是当我运行它时,我得到预期的输出后跟一个seg错误.我正在使用GDB调试器,并且在返回语句之后,seg错误似乎发生在最后一行代码上!这是内存管理问题吗?

Dan*_*her 6

你永远不会malloc记忆poAtoms.写入未初始化指针指向的位置很容易导致段错误.

在开始阅读文件之前,您应该分配一些空间,

unsigned expected_count = 2; // for the test input file, would be much larger in real runs
poAtoms = malloc(expected_count*sizeof(*poAtoms));
Run Code Online (Sandbox Code Playgroud)

然后你必须在读循环内检查你没有写过分配的内存.之前

    poAtoms[count] = Atom_new(iType, iID, pdPosition, pdVelocity);
Run Code Online (Sandbox Code Playgroud)

插入支票,

    if (expected_count <= count)
    {
        expected_count *= 2;   // double the space, could also be a smaller growth factor
        Atom *temp = realloc(poAtoms, expected_count*sizeof(*poAtoms));
        if (temp == NULL)
        {
            perror("Reallocation failed, exiting\n");
            exit(EXIT_FAILURE);
        }
        poAtoms = temp;
    }
Run Code Online (Sandbox Code Playgroud)

如果分配的空间poAtoms已经被使用,尝试获取更多realloc,如果失败,则中止,除非您知道如何修复它.如果重新分配成功,我们可以继续收集新原子.