【发布时间】: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 标记为已过时,它们将被删除。