试图返回前K学生
问题描述:
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;
}
有代码没有生成错误,但我得到的地址,而不是值试图返回前K学生
答
的通过使你的函数返回一个指针的指针,你会得到这样一个多层次的间接寻址:你返回一个本地指针的地址,但指针在返回后超出范围,使得该地址无效。
这里的解决方案是直接返回的句柄:
struct student *topKStudents(struct student *students, int len, int K)
{
student* top_students = malloc(K * sizeof(*top_students));
// fill array
return top_students;
}
这种设计意味着调用的代码具有晚些时候free
返回的指针。另一种可能的设计是在阵列中通过,并让调用代码照顾分配:
int topKStudents(struct student *res, int K,
const struct student *students, int len)
{
// fill res
return 0;
}
返回值可以是成功的值,例如0表示成功和− 1失败,或它可以返回FILLES结果阵列,其中,取决于你的函数,可以小于K
的大小。
这样的设计可以让你分配结果数组堆栈,这是一个很好的选择,如果K
很小的。这个答案确实解决了函数返回数组的问题,它没有处理手头的问题,你返回顶级学生的代码只是对原始数组进行排序,这意味着你不需要为每个数组返回一个数组,吨真的必须返回一个数组:您修改阵列后的高材生都在K
第一位置)
好一件事,你返回一个局部变量的地址。呼叫返回后,该地址无效,因此永远无法正确使用。理解函数返回时变量'top_students'已经失效。我建议返回它的价值而不是地址。 –
你可以从简单的事情开始避免很多工作:返回前两名学生的功能。 – Beta