讨论/技术交流/请问 qsort 如何对一个元素是结构体的数组进行多级排序?/
请问 qsort 如何对一个元素是结构体的数组进行多级排序?

C语言,考试的时候我这样写的代码:
想对结构体按照 sub 从大到小排序,如果 sub 大小相同,按照 left 从小到大排序

struct Point {
    int left;
    int right;
    int index;
    int sub;
};

int Compare(const void *a, const void *b)
{
    struct Point first = *(struct Point *)a;
    struct Point second = *(struct Point *)b;
    if (first.sub > second.sub) {
        return first.sub - second.sub;
    }
    return first.left - second.left;
}

但是一直报 "运行时错误:引用绑定到类型“struct Point”的未对齐地址0xXXXXXX,该类型需要4字节对齐。。"
求高人解惑,用qsort做结构体数组的多级排序时 compare 函数应该怎么写?

3
共 4 个回复

是啊,专业级的时候我第三题就在这卡住了,代码很快写好了,但是调试没搞定这个二级排序

兄弟考的可是可信?

你这么写应该是可以的,我怀疑自己的错误应该是qsort调用的时候第2和第3个参数写反了,比如

qsort(num, numsSize, sizeof(int), Compare);

写成了

qsort(num, sizeof(int), numsSize, Compare);

找了一些资料看,下面这篇讲了一些compare函数的大致情况,可以参考:
https://blog.csdn.net/tom_black/article/details/77443982

int cmp(const void *a, const void *b)
{
    struct point *aa = (struct point *)a;
     struct point *bb = (struct point *)b;
     if(aa->sub != bb->sub)
         return(((aa->sub) < (bb->sub)) ? 1 : -1);
     else
         return((aa->left) - (bb->left));
}

大概是这么写的?