2016-03-06 26 views
-2
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学生

+0

好一件事,你返回一个局部变量的地址。呼叫返回后,该地址无效,因此永远无法正确使用。理解函数返回时变量'top_students'已经失效。我建议返回它的价值而不是地址。 –

+0

你可以从简单的事情开始避免很多工作:返回前两名学生的功能。 – Beta

回答

1

的通过使你的函数返回一个指针的指针,你会得到这样一个多层次的间接寻址:你返回一个本地指针的地址,但指针在返回后超出范围,使得该地址无效。

这里的解决方案是直接返回的句柄:

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第一位置)