Malloc / Calloc 在第二次交互时崩溃

Malloc / Calloc crashing on the second interaction

提问人:Bubi 提问时间:8/18/2022 最后编辑:chqrlieBubi 更新时间:8/18/2022 访问量:86

问:

我有一个程序,它应该向我记忆中的学生返回一个指针数组。 当我的程序第一次按应有的方式工作时,第二次运行时(我调用操作有一个 3 时间循环),我崩溃了,编译器没有任何解释。我真的很感激能解释为什么会发生这种情况。

Student **getMyStudentBySize(Student *allStudent, int wantSize,
                             int maxsize, Teacher *pteacher) {      
    int counter = 0;
        
    Student **myStudent = (Student **)malloc(1 * sizeof(Student *));
    for (int i = 0; i < MAX_TOTAL_STUDENT; i++) {
        for (int h = 0; h < NUMBER_OF_CLASSES; h++) {
            if (allStudent[i].myClassRoom) {
                if (strcmp(allStudent[i].myTeachers[h]->name,
                           (char *)pteacher->name) == 0) {
                    myStudent[counter++] = &allStudent[i];
                    break;
                }
            } else
                break;
        }
    }
    return myStudent;
}

我在这里调用函数:(并且该程序是从另一个调用它 3 次的函数调用的)

void assignTeacher(Teacher **teacherArray, ClassRoom **allClassRooms,
                   Student *allStudents) {
    int mySize = helperAssignTeacher(allStudents, *teacherArray, NULL);
    Student **myStudentFor = getMyStudentBySize(allStudents, mySize,
                                 allClassRooms[chooseClassRoom - 1]->maxSize,
                                 ((*teacherArray) + (chooseTeacher - 1)));
    printAllStudent(myStudentFor, allClassRooms[chooseClassRoom - 1]->maxSize);
}

错误消息:

enter image description here

它出现在第二次交互中

Student **myStudent = (Student **)malloc(1 * sizeof(Student *));
c struct dynamic malloc calloc

评论

2赞 kaylum 8/18/2022
malloc(1 * sizeof(Student*))您只为一个条目分配空间,然后继续设置多个条目。如果这不是问题,或者您需要进一步的帮助,那么您需要提供更完整的代码(您甚至没有显示任何调用,但您的标题暗示您有一些调用)。因此,请提供一个完整的最小可重复示例calloc
0赞 Bubi 8/18/2022
我把它改成了“Student $$myStudent =(Student$$) malloc(maxsize * sizeof(Student*));”,但我想发送 3 次我以动态方式完成的学生 ** “数组”,它有问题吗?
4赞 kaylum 8/18/2022
不知道“向学生发送 3 次”是什么意思。请提供完整的代码作为最小的可重现示例,以说明您正在尝试执行的操作。
0赞 Bubi 8/18/2022
我的代码太长了,我无法发送整个内容,但最终这个结构应该有一个类(ClassRoom),其中包含一组指向班中学生的指针,我应该将属于某个老师的学生返回到班级。目前我有 3 节课,这意味着此操作将重复 3 次(并且每次都会向我返回一组适合新老师的学生)
3赞 kaylum 8/18/2022
这里面有“最小”这个词。请阅读链接。不要求完全转储您的代码。事实上,我们不希望那样。将代码减少到最小的相关部分,这些部分仍然完整,可以显示问题。用文字描述代码几乎总是不清楚的。我们需要查看实际代码。

答:

1赞 chqrlie 8/18/2022 #1

分配一个长度为 而不是 的指针数组。由于缓冲区溢出,您有未定义的行为。如果将条目存储在数组末尾之外不会立即产生不利影响,则代码可能看起来可以正常工作,但下一次调用会导致分段错误,这可能是因为内存分配数据已损坏。1MAX_TOTAL_STUDENTmalloc

目前尚不清楚 and 参数的含义,因为您在所有情况下都会遍历条目。wantSizemaxsizeMAX_TOTAL_STUDENT

以下是修改后的版本:

Student **getMyStudentBySize(Student *allStudent, int wantSize,
                             int maxsize, Teacher *pteacher) {      
    int counter = 0;
        
    Student **myStudent = calloc(MAX_TOTAL_STUDENT, sizeof(*myStudent));
    if (!myStudent)
        return NULL;
    for (int i = 0; i < MAX_TOTAL_STUDENT; i++) {
        for (int h = 0; h < NUMBER_OF_CLASSES; h++) {
            if (allStudent[i].myClassRoom) {
                if (strcmp(allStudent[i].myTeachers[h]->name,
                           (char *)pteacher->name) == 0) {
                    myStudent[counter++] = &allStudent[i];
                    break;
                }
            } else
                break;
        }
    }
    return myStudent;
}

评论

0赞 Bubi 8/18/2022
嘿伙计,你是对的,但我的代码仍然在第二次崩溃 *Student **myStudent = calloc(MAX_TOTAL_STUDENT, sizeof(*myStudent));
0赞 chqrlie 8/18/2022
@Bubi:如果收到崩溃调用,则表明内存损坏。该错误可能在其他地方,在您未发布的代码中。发布一个显示问题的最小的完整可编译程序。calloc