我试图在此代码段中找到与内存分配相关的两个错误。在讲座中说第一个错误是返回类,第二个错误没有释放内存。我不明白为什么第一个是错误。第二个我不确定,但很清楚为什么。
对于第一个错误,class是一个学生数组,函数getClassInfo返回一个指向这个数组的指针,对我来说似乎很好。
我想我明白为什么记忆应该是免费的。在for循环的每次迭代中,thisStudent由malloc分配内存,然后将class [i]赋值给thisStudent的值。在每次迭代中,thisStudent都会重新分配一个新的内存块,但最后一个内存永远不会被释放。
任何关于为什么第一个错误是错误的说明将不胜感激! 谢谢 - 克里斯
#include <stdio.h>
#define CLASS_SIZE 500
typedef struct student {
int studentNr;
char grade;
} student;
student * getClassInfo(void){
int i;
student class[CLASS_SIZE];
for(i = 0; i < CLASS_SIZE; i++){
student * thisStudent = (student*) malloc(sizeof(student));
if(thisStudent == NULL) return(NULL);
scanf("%d %c", &(thisStudent->studentNr),&(thisStudent->grade));
class[i] = *thisStudent;
}
return class;
}
我确实收到一条警告,说它在编译时会返回一个局部变量的地址,但是这是一个与内存分配有关的错误?
答案 0 :(得分:2)
class
是getClassInfo()
函数中的局部变量,这意味着当该函数返回时它不再存在。 return class;
语句返回一个指针,当调用者收到该指针时,该指针不再有效。
您应该将class
声明为student*
并使用malloc()
动态分配,就像您对学生本身一样。这会在堆上分配它,因此它会继续存在,直到您明确free()
它为止。您希望malloc(sizeof(student) * CLASS_SIZE)
为所有学生结构分配连续的空间。
你是对的,不释放循环中分配的student
结构是一个错误(特别是内存泄漏)。实际上,你根本不需要动态分配学生;您可以将学生编号和成绩存储到class[i].studentNr
和class[i].grade
。