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

时间:2014-03-13 00:30:23

标签: c memory-management free

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

对于第一个错误,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;
}

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

1 个答案:

答案 0 :(得分:2)

classgetClassInfo()函数中的局部变量,这意味着当该函数返回时它不再存在。 return class;语句返回一个指针,当调用者收到该指针时,该指针不再有效。

您应该将class声明为student*并使用malloc()动态分配,就像您对学生本身一样。这会在堆上分配它,因此它会继续存在,直到您明确free()它为止。您希望malloc(sizeof(student) * CLASS_SIZE)为所有学生结构分配连续的空间。

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