struct student ** topKStudents(struct student *students, int len, int K) {
student* top_students = (struct student *)(malloc(K * sizeof(struct student)));
struct student temp;
int i;
for (i = 0; i < len - 1; i++){
for (int j = 0; j < len - 1; j++)
if (students[j + 1].score>students[j].score){
temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
for (i = 0; i < K; i++){
top_students[i] = students[i];
}
return &top_students;
}
代码中没有构建错误,但我获取的是地址而不是值
最佳答案
通过让你的函数返回一个指向指针的指针,你会得到太多的间接层:你返回本地指针的地址,但指针在返回后超出范围,使该地址无效。
这里的解决方案是直接返回句柄:
struct student *topKStudents(struct student *students, int len, int K)
{
student* top_students = malloc(K * sizeof(*top_students));
// fill array
return top_students;
}
这种设计意味着调用代码必须稍后释放
返回的指针。另一种可能的设计是传入一个数组并让调用代码负责分配:
int topKStudents(struct student *res, int K,
const struct student *students, int len)
{
// fill res
return 0;
}
返回值可以是成功值,例如0 表示成功,-1 表示失败,或者它可以返回填充结果数组的大小,根据您的函数,该大小可能小于 K
。
这种设计允许您在堆栈上分配结果数组,如果 K
很小,这是一个不错的选择。
(这个答案实际上解决了如何从函数返回数组的问题。它没有处理手头的问题。您返回顶尖学生的代码只是对原始数组进行排序,这意味着您不确实必须返回一个数组:修改数组后,成绩最好的学生位于 K
前面的位置。)
关于c - 努力让前 K 学生回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35829810/