提问人:Bubi 提问时间:8/18/2022 最后编辑:chqrlieBubi 更新时间:8/18/2022 访问量:86
Malloc / Calloc 在第二次交互时崩溃
Malloc / Calloc crashing on the second interaction
问:
我有一个程序,它应该向我记忆中的学生返回一个指针数组。 当我的程序第一次按应有的方式工作时,第二次运行时(我调用操作有一个 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);
}
错误消息:
它出现在第二次交互中
Student **myStudent = (Student **)malloc(1 * sizeof(Student *));
答:
1赞
chqrlie
8/18/2022
#1
分配一个长度为 而不是 的指针数组。由于缓冲区溢出,您有未定义的行为。如果将条目存储在数组末尾之外不会立即产生不利影响,则代码可能看起来可以正常工作,但下一次调用会导致分段错误,这可能是因为内存分配数据已损坏。1
MAX_TOTAL_STUDENT
malloc
目前尚不清楚 and 参数的含义,因为您在所有情况下都会遍历条目。wantSize
maxsize
MAX_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
评论
malloc(1 * sizeof(Student*))
您只为一个条目分配空间,然后继续设置多个条目。如果这不是问题,或者您需要进一步的帮助,那么您需要提供更完整的代码(您甚至没有显示任何调用,但您的标题暗示您有一些调用)。因此,请提供一个完整的最小可重复示例。calloc