我已经为此绞尽脑汁好几个小时了。这将数据从文本文件读入结构(每行有四个字符串,每行代表一个新学生)。我在重定位(接近尾端)上遇到一个seg错误。我怀疑我不理解指针如何与malloc/realloc交互。

struct student* createInitialStudentArray(FILE *fp) {
    char buf[20+1] = {0};
    int word = 1, studcount = 1;
    struct student* studentArray = malloc(sizeof(struct student));
    assert(studentArray != NULL);
    while (fscanf(fp, " %20s", buf) != EOF) {
        if (word % 4 == 1) {
            sscanf(buf, "%4d", &studentArray[studcount].studentID);
            word++;
        }
        else if (word % 4 == 2) {
            strcpy(studentArray[studcount].lastName, buf);
            word++;
        }
        else if (word % 4 == 3) {
            strcpy(studentArray[studcount].firstName, buf);
            word++;
        }
        else if (word % 4 == 0) {
            sscanf(buf, "%10lld", &studentArray[studcount].phoneNumber);
            word = 1;
            studcount++;
            studentArray = realloc(studentArray, studcount * sizeof(struct student));
            assert(studentArray != NULL);
        }
    }

    return studentArray;
}

是什么导致这个seg故障?
提前谢谢你,
格斯

最佳答案

如果数组中有studcount元素,则studentArray[studcount]超过了数组的结尾,不允许在那里写入。要访问的有效元素是0studcount-1。您应该将studentArray[studcount]替换为studentArray[studcount-1]以写入最后一个元素。
注意,这样做会在循环完成时给您一个studcount值,这个值太大了,因为数组的最后一个元素总是空的或不完整的。
正如pmg在评论中提到的,另一个解决方案是将1初始化为0,这将解决上述两个问题,但是在编写新的元素之前,您需要确保至少为studcount元素分配空间。

09-07 07:29