动态结构的动态数组上的qsort

时间:2018-06-06 23:36:18

标签: c pointers struct qsort pointer-to-pointer

我有以下结构

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->xpp->x是随机奇怪的数字)。

qsort(manyfoos, 10, sizeof(FOO *), foocmp);

如何按预期完成此工作?

1 个答案:

答案 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,这样就不会重复遍布代码的类型。