【发布时间】:2026-01-07 10:00:01
【问题描述】:
我有一个结构数组,需要根据属性进行排序。我做了一个比较函数来做到这一点,但问题是数组可以有 NULL 值,这会导致错误。以下是我的代码的相关部分:
#define MAX_NUM 5
struct d {
int id;
int p;
int prio;
} d;
struct d *P[MAX_NUM];
int compare(const void *p, const void *q)
{
int l = ((struct d *)p)->prio;
int r = ((struct d *)q)->prio;
if (l < r) return -1;
else if (l > r) return 1;
else return 0;
}
我这样调用 qsort 函数:
qsort(P, MAX_NUM, sizeof(P[0]), compare);
我认为这在正常情况下应该可以工作,但由于数组 P 有 NULL 值,所以它没有。我怎样才能使这项工作?
编辑:我最后一次修改基于 cmets 的比较函数:
int usporedba(const void* a, const void* b)
{
struct d arg1 = *(const struct d*)a;
struct d arg2 = *(const struct d*)b;
if (arg1.prio < arg2.prio) return -1;
if (arg1.prio > arg2.prio) return 1;
return 0;
}
【问题讨论】:
-
struct d *P[MAX_NUM];这是一个指向结构体的数组,而问题是结构体数组。struct dretva未定义。sizeof(d)这不是P中元素的大小,请贴出真实代码。 -
我的问题标题有误,我对 C 不是很有经验。我在这里更改了一些变量名,但我想我忘记了一些,但现在已经修复了。整个代码有点长,所以我只发布了重要部分,其他一切都与问题无关。
-
问题仍然是您想要排序的内容。结构数组将是
struct d P[MAX_NUM];。相反,发布的代码显示了一个指向结构的指针数组。任何一个都可以排序,但qsort调用在这两种情况下是不同的。此外,sizeof(P)在这两种情况下仍然是错误的。请参阅docs,尤其是size参数。并且,请再次发布重现该问题的最少但完整的代码。 -
@dxiv 它需要保留一个指向结构的指针数组,在这种情况下 qsort 调用应该是什么?
-
链接的例子有
int arg1 = *(const int*)a;。现在将int替换为struct d*。