我有以下结构
struct FOO {
int x;
double y;
}
和数组
FOO **manyfoos;
manyfoos = malloc( 10 * sizeof(FOO *) );
此后manyfoos
填充了动态分配的FOO *
元素
manyfoos[i] = malloc( sizeof(FOO) );
manyfoos[i]->x = x;
manyfoos[i]->y = y;
我现在想用manyfoos
和以下比较函数
qsort()
进行排序
int foocmp(const void * p, const void * q) {
const FOO * pp = (const FOO *)p;
const FOO * qq = (const FOO *)q;
return qq->x - pp->x;
}
不幸的是,以下命令会产生意外结果(qq->x
和pp->x
是随机奇怪的数字)。
qsort(manyfoos, 10, sizeof(FOO *), foocmp);
如何按预期完成此工作?
答案 0 :(得分:0)
嗯,您的比较功能已关闭。
它得到的参数是指向数组qsort()
中尝试排序的元素的指针,因此指向FOO*
。
固定比较功能是:
int foocmp(const void * p, const void * q) {
const FOO* const * pp = p;
const FOO* const * qq = q;
return (*qq)->x - (*pp)->x; // Beware of overflow / underflow
}
我也遗漏了多余的演员。
顺便说一句,避免使用sizeof(TYPE)
。请改用sizeof expr
,这样就不会重复遍布代码的类型。