对动态结构的动态数组进行 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->x
和 pp->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
,这样您就不会重复散布在整个代码中的类型。
我有以下结构
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->x
和 pp->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
,这样您就不会重复散布在整个代码中的类型。