qsort 结构数组降序

qsort array of structs descending order

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

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 以下内容:

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

它也有很好的 属性 总是 returning -1、0 或 1 而不是任意数字。