【问题标题】:C: Using qsort to sort an array of pointers to an ADT (struct)C:使用 qsort 对指向 ADT(结构)的指针数组进行排序
【发布时间】:2015-12-13 15:29:39
【问题描述】:

我一直在尝试使用 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 的数组(在 main() 中)

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() 时弄乱了指针,但我不确定如何。

我想我包含了所有相关的代码。告诉我你是否需要找到我的错误。

【问题讨论】:

    标签: c arrays pointers qsort


    【解决方案1】:

    qsort() 将指向数组元素的指针传递给比较函数。所以,如果你有一个int的数组,比较函数会收到int *。

    您正在尝试对指向SSET 的指针数组进行排序,即SSET * 的数组。因此,比较函数将接收指向SSET 的指针(即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);
    

    【讨论】:

      【解决方案2】:
      SSET *pa = (SSET *) a;
      

      看起来不对。 qsort 将指向元素的指针传递给比较函数。您的数组元素是指针,因此您的比较函数接收指向指针的指针:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-04
        • 2021-08-02
        • 2016-11-29
        • 2020-03-15
        • 2012-05-13
        • 1970-01-01
        • 2021-09-20
        相关资源
        最近更新 更多