我想在代码片段中找到与内存分配相关的两个错误。在讲座中说,第一个错误是返回类,第二个不释放内存。我不明白为什么第一个是错误。第二个我不确定,但有一个好主意,为什么。C语言中的内存管理错误。为什么这些错误?
对于第一个错误,class是一个学生数组,函数getClassInfo返回一个指向这个数组的指针,对我来说似乎很好。
我想我明白为什么内存应该free'd虽然。在for循环的每次迭代中,thisStudent被malloc分配内存,然后class [i]被分配给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;
}
我得到一个警告说,它的返回一个局部变量的地址,编译时,但如何是关系到内存分配错误?
由于数组是本地的函数,它不再存在于函数出口,所以你正在返回的指针指向一个现在已经死亡的。这可能是关于C最常见的问题,我很惊讶你没有找到答案。 –
我同意我在问之前应该多研究一下,有时候我似乎只是试图提出一个好问题就能更好地发现问题。感谢您通过Matteo的帮助! – kiwicomb123
顺便说一下,请注意'class'是C++中的一个关键字,如果您尝试使用C++编译器编译此代码,将导致编译错误。只要你坚持使用C,它就不是问题,但是因为*大多数有效的C代码也是有效的C++,并且有时可以将它编译为C++,所以避免使用C++关键字可能是谨慎的作为C程序中的标识符。考虑命名你的数组'学生',而不是。 – Wyzard