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

标签 c memory-management free

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

对于第一个错误,类是一个学生数组,函数 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;
}

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

最佳答案

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

您应该将 class 声明为 student* 并使用 malloc() 动态分配它,就像您为学生自己做的那样。这会将它分配到堆上,因此它会一直存在,直到您明确地 free() 它为止。您需要执行 malloc(sizeof(student) * CLASS_SIZE) 为所有学生结构分配连续空间。

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

关于c - C语言中的内存管理错误。为什么会出现这些错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366768/

相关文章:

javascript - c xor 结果与 javascript xor 不同

C++ delete 不释放所有内存 (Windows)

c++ - 使用 placement new、malloc 和 free

c++ - 为什么 "const T*"在 "void*"中被简单地转换为 "operator delete"?

c++ - 需要 C++ 解析器

c++ - 您如何将单元测试引入大型的遗留 (C/C++) 代码库?

c++ - 具有C语言绑定(bind)的静态成员函数?

c - 负复数幂

iPhone - 为什么静态分析器没有选择它?

c++ - 什么决定了我的可执行文件的大小?