我试图在这段代码中找出两个与内存分配相关的错误。讲座中说,第一个错误是返回类,第二个错误是没有释放内存。我不明白为什么第一个是错误的。第二个我不确定,但很清楚为什么。
对于第一个错误,类是一个学生数组,函数 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;
}
我确实收到一条警告,说它在编译时返回了局部变量的地址,但这是与内存分配相关的错误吗?
最佳答案
class
是 getClassInfo()
函数中的局部变量,这意味着当该函数返回时它不再存在。 return class;
语句返回一个指针,该指针在调用者收到它时不再有效。
您应该将 class
声明为 student*
并使用 malloc()
动态分配它,就像您为学生自己做的那样。这会将它分配到堆上,因此它会一直存在,直到您明确地 free()
它为止。您需要执行 malloc(sizeof(student) * CLASS_SIZE)
为所有学生结构分配连续空间。
你是对的,不释放在循环中分配的 student
结构是一个错误(特别是内存泄漏)。您实际上根本不需要动态分配学生;您可以将学号和成绩存储到 class[i].studentNr
和 class[i].grade
中。
关于c - C语言中的内存管理错误。为什么会出现这些错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366768/