【问题标题】:C free memory from struct arrayC从结构数组中释放内存
【发布时间】:2016-09-30 18:16:35
【问题描述】:

任务是创建一个结构数组,其中包含 10 个元素作为“学生”,每个元素都有一个分数和一个 ID。我不允许在代码中更改某些内容(例如 main 中的任何内容)。

#include <stdio.h>
#include <stdlib.h>

struct student* allocate(){
    struct student* array = malloc(10 * sizeof(struct student));
    return array;
}

void deallocate(struct student* stud){
    int i = 0;
    for(;i<10;i++)
        free(&stud[i]);
}

所以这编译正常,其余代码运行正常,但是当它到达 free() 时核心转储。此外,这是我的教授给我的主要内容,并告诉我不要改变。没有调用 deallocate 函数,所以现在我想知道它是否在 main 完成时自动被调用,或者他是否错误地忽略了它。我添加它是因为我认为这似乎是合理的。

int main(){
  struct student* stud = allocate();
  generate(stud);
  output(stud);
  sort(stud);
  for(int i=0;i<10;i++){
    printf("%d %d\n", stud[i].id,stud[i].score);
  }
  printf("Avg: %f \n", avg(stud));
  printf("Min: %d \n", min(stud));
  deallocate(stud);    
  return 0;
}

【问题讨论】:

  • 顺便我正在编译使用gcc。
  • 你有什么问题?
  • malloc() 的电话有多少? free() 打了多少电话?为什么数字不一样?你怎么能阻止它与众不同?对于malloc() 的每次调用,都应该有一个free()。 (如果你使用realloc(),它可以在计数工作中抛出一个扳手——它可以分配、重新分配空闲内存——但这个概念适用。)
  • 所以你的教授给了你代码并告诉你不要改变它。你改变它是因为你“认为这似乎是合理的”。好的。
  • 请注意,关于“不更改 main 中的代码”的 cmets 源于您提到它不会被更改。由于您从教授那里获得了不可变代码的修改版本,因此您应该考虑是否(您需要)更新问题以删除有关更改不可变代码的观察结果。然后,我们可以将有关更改的 cmets 标记为已过时,它们将被删除。

标签: c arrays struct free


【解决方案1】:

(m)allocated 10-students 数组作为 1 个连续的内存块和 1 个 malloc 调用(这是正确的)。

要释放它,您只需在第一个数组元素上使用一次free。这将释放整个连续的内存块,即整个 10-students 数组。

【讨论】:

    【解决方案2】:

    嘿哈哈,我想是在同一个班。我正在做同样的程序。这就是我执行解除分配功能的方式,并且没有内存泄漏或转储:

    void deallocate(struct student* stud){
        free(stud);
    }
    

    【讨论】:

    • 谢谢!您是否必须在 main 中添加对函数的调用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2019-03-11
    • 2021-08-26
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多