c - qsort 结构数组降序

标签 c arrays struct comparator qsort

我有一个看起来像这样的结构

typedef struct id_score{
   int id;
   int score;
} pair;

大小为 50 的数组包含指向这些对的指针

pair* array[50]

我的比较函数是这样的

int struct_cmp(const void *a, const void* b) {
    pair* ia = (pair*)a;
    pair* ib = (pair*)b;
    printf("ia's score: %d ib's score: %d??? \n", ia->score, ib->score);
    return ib->score - ia->score;
}

我的 qsort 函数在这里

size_t arr_len = sizeof(array) / sizeof(pair);
qsort(array, arr_len, sizeof(pair), struct_cmp);

现在我的问题是,在 struct_cmp 函数中,我的 printf 显示我认为应该是数组中每个结构中的计数的值都被解释为0,因此根本不对数组进行排序。当我通过数组打印时,在函数之外,结构具有它应该具有的分数。

有什么建议吗?谢谢!

最佳答案

一个人

size_t arr_len = sizeof(array) / sizeof(pair);

上面是错误的,因为你的数组包含pair 指针,而不是pair。更地道一点且重复更少的做法是:

size_t arr_len = sizeof(array) / sizeof(array[0]);

另一件需要注意的事情是,您的比较函数转换为错误的指针类型,因此您的程序的行为是未定义的。

请记住,回调函数将接收指向数组元素的指针,因此如果数组包含指针,它应该将参数转换为指向指针的指针:

int struct_cmp(const void *a, const void* b) {
    pair* const * ia = (pair* const *)a;
    pair* const * ib = (pair* const *)b;
    printf("ia's score: %d ib's score: %d??? \n", ia->score, ib->score);
    return (*ib)->score - (*ia)->score;
}

与您原来的功能不同,我也努力使其 const 正确。比较回调接受指向 const 的指针,因此转换后的指针也应该指向 const(const 应用于元素类型,即 pair*)。


正如 chux 所指出的,作为一种避免减法溢出的方法,一个主要的改进是返回以下内容:

return ((*ib)->score > (*ia)->score) - ((*ib)->score < (*ia)->score);

它还有一个很好的属性,即总是返回 -1、0 或 1 而不是任意数字。

关于c - qsort 结构数组降序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42427248/

相关文章:

c++ - 在 OpenGL 中使用索引缓冲区对象的结构会导致段错误

c# - 将(结构的)实例方法传递给 ThreadStart 似乎更新了一个虚假实例,因为原始实例不受影响

python - 无法在使用系统调用运行 Python 脚本的 PostgreSQL 中执行 C 函数

c - 计算机是否为数组的变量名分配内存?

c - 在 c 的命令行中使用标志读写文件

c++ - N 选择 k 为大 n 和 k

c - 链表删除位置 N 的节点

c - 为什么在同一地址空间的两个不同指针上调用 malloc?

javascript - 在 Javascript 中将 json 对象内的 JSON 对象转换为 JSON 数组

arrays - 从 JSON 数组中的每个元素中删除一个键 - Ruby