对动态结构的动态数组进行 qsort

qsort on dynamic array of dynamic structs

我有以下结构

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;

我现在想用 qsort() 和下面的比较函数

manyfoos 进行排序
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);

我怎样才能使它按预期工作?

嗯,你的比较功能关闭了。

它获取的参数是指向数组中元素的指针 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,这样您就不会重复散布在整个代码中的类型。