c - 努力让前 K 学生回归

标签 c arrays structure

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/

相关文章:

c - execl 没有捕获所有参数

无法从指向数组的指针数组中读取

java - 获取二维数组的长度

javascript - 生成器未定义

java - 多模块 Java 项目是否应该有多个 Gradle 项目

c - 使用 glib 的 g_new() 进行内存分配

c - 每个源文件的标题

c - C 中的整数溢出和数字错误防御

java - 这是一个内部类吗

c - 如何在结构体中使用指针?