【问题标题】:Trying to Return top K Students试图返回前 K 名学生
【发布时间】:2016-03-06 17:07:26
【问题描述】:
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;
}

代码中没有构建错误,但我得到的是地址而不是值

【问题讨论】:

  • 好吧,一方面,您返回的是局部变量的地址。该地址在调用返回后立即无效,因此永远无法正确使用。了解当函数返回时变量top_students 消失了。我建议返回它的值而不是它的地址。
  • 你可以从一些更简单的东西开始避免很多工作:一个返回前两个学生的函数。

标签: c arrays structure


【解决方案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 表示失败,或者它可以返回填充结果数组的大小,这取决于您的函数,可能小于K

这种设计可以让你在栈上分配结果数组,如果K很小,这是一个不错的选择。

(这个答案真正解决了如何从函数返回数组的问题。它没有处理手头的问题。您返回高材生的代码只是对原始数组进行排序,这意味着您没有真的要返回一个数组:修改数组后,优等生在K第一位置。)

【讨论】:

    猜你喜欢
    • 2012-02-06
    • 2017-12-14
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多