我一直试图使用qsort()对ADT的指针数组进行排序(命名为SSET),但我得到了一个奇怪的结果。这是我的功能:

extern void sset_sort_sets(SSET *sets[], int n) {
    qsort(sets, n, sizeof(SSET *), sset_cmp);
}

sset_cmp()中,我放了一个语句来打印它正在比较的SSETs。
int sset_cmp(const void *a, const void *b){
    SSET *pa = (SSET *) a;
    SSET *pb = (SSET *) b;

    printf("sset_cmp called:\n");
    printf("  a = "); sset_display(pa);
    printf("  b = "); sset_display(pb);
    printf("\n");

    // More stuff...

我创建了一个由两个SSETs组成的数组(inmain()
SSET *s[2];
int a[] = {-4, 0, 3, 3, 22};
int c[] = { 1, 2, 3, 4, 5};
s[0] = sset_from_array(c, n); // { 1 2 3 4 5 }
s[1] = sset_from_array(a, n); // { -4 0 3 22 }

int i;
printf("Before sort:\n");
for (i = 0; i < 2; i++)
    sset_display(s[i]);
printf("\n");

sset_sort_sets(s, 2);

printf("After sort\n");
for (i = 0; i < 2; i++)
    sset_display(s[i]);

但这里是我在输出中得到的:
Before sort:
  { 1 2 3 4 5 }
  { -4 0 3 22 }

sset_cmp called:
  a =   { -1589621936 -4 0 3 22 }
  b =   { -1589621568 }

After sort
  { 1 2 3 4 5 }
  { -4 0 3 22 }

我想我在调用qsort()时把指针弄乱了,但我不知道怎么回事。
我想我包括了所有相关的代码。告诉我还有没有其他的环节你需要找出我的错误。

最佳答案

qsort()将指向数组元素的指针传递到比较函数中。因此,如果数组是int,那么比较函数将收到int *
您试图对指向SSET的指针数组进行排序,即SSET *的数组。因此,比较函数将接收指向SSET(so,SSET **)指针的指针。
所以你需要改变这个:

SSET *pa = (SSET *) a;
SSET *pb = (SSET *) b;

致:
SSET *pa = *(SSET **) a;
SSET *pb = *(SSET **) b;

此外,通常最好不要将类型名硬编码为sizeof的操作数。如果类型发生更改,则这是以后必须更新的另一个位置,并且可能会出错,因为必须记住使用正确的类型。
考虑更改此行:
qsort(sets, n, sizeof(SSET *), sset_cmp);

致:
qsort(sets, n, sizeof(sets[0]), sset_cmp);

09-25 19:00