C语言中的内存管理错误。为什么会出现这些错误?

C语言中的内存管理错误。为什么会出现这些错误?,c,memory-management,free,C,Memory Management,Free,我试图在这个代码片段中找到两个与内存分配相关的错误。讲座中说第一个错误是返回类,第二个错误不是释放内存。我不明白为什么第一个是错误的。第二个我不确定,但我很清楚为什么 对于第一个错误,类是一个学生数组,函数getClassInfo返回一个指向这个数组的指针,这在我看来很好 我想我明白为什么记忆应该是自由的。在for循环的每次迭代中,malloc为thistudent分配内存,然后将类[i]分配给thistudent的值。在每次迭代中,这个学生都会被重新分配一个新的内存块,但最后一个内存块永远不会

我试图在这个代码片段中找到两个与内存分配相关的错误。讲座中说第一个错误是返回类,第二个错误不是释放内存。我不明白为什么第一个是错误的。第二个我不确定,但我很清楚为什么

对于第一个错误,类是一个学生数组,函数getClassInfo返回一个指向这个数组的指针,这在我看来很好

我想我明白为什么记忆应该是自由的。在for循环的每次迭代中,malloc为thistudent分配内存,然后将类[i]分配给thistudent的值。在每次迭代中,这个学生都会被重新分配一个新的内存块,但最后一个内存块永远不会被释放

请澄清第一个错误是错误的原因,我们将不胜感激! 非常感谢。 -克里斯

#包括
#定义类_尺寸500
类型定义结构学生{
国际学生;
煤焦品位;
}学生;
学生*getClassInfo(无效){
int i;
学生班级[班级规模];
对于(i=0;i学生编号)、&(该学生->成绩));
班级[i]=*该学生;
}
返回舱;
}

我确实收到一条警告,说它在编译时返回一个局部变量的地址,但这是一个与内存分配有关的错误吗?

class
getClassInfo()
函数中的一个局部变量,这意味着当该函数返回时它就不再存在了。
返回类语句返回一个指针,该指针在调用方接收到它时不再有效

您应该将
类声明为
学生*
,并使用
malloc()
动态分配它,就像您为学生自己所做的那样。它在堆上分配它,因此它将继续存在,直到显式地
free()
it。您需要执行
malloc(sizeof(student)*CLASS\u SIZE)
为所有student结构分配连续空间


不释放循环中分配的
student
结构是一个bug(特别是内存泄漏),这是对的。实际上,您根本不需要动态分配学生;您只需将学生编号和成绩存储到
类[i].studentNr
类[i].grade

中即可。由于数组是函数的本地数组,因此它在函数出口处不再存在,因此您返回的指针指向一个现已消失的数组。这可能是问得最多的关于C的问题,我很惊讶你还没有找到答案。我同意在问之前我应该多研究一下,有时候我似乎通过尝试问一个好问题来更好地解决这个问题。谢谢你的帮助,尽管马特奥!顺便说一下,类< /C>是C++中的关键字,如果你试图用C++编译器编译这个代码,就会导致编译错误。只要严格遵守C,这不是问题,但是由于大多数有效的C代码也是有效的C++,有时编译为C++是有用的,所以避免在C程序中使用C++关键字作为标识符是谨慎的。考虑命名你的数组<代码>学生<代码>。
#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;
}