首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C:使用qsort对指向ADT (struct)的指针数组进行排序。

C:使用qsort对指向ADT (struct)的指针数组进行排序。
EN

Stack Overflow用户
提问于 2015-09-16 21:15:06
回答 2查看 160关注 0票数 1

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

代码语言:javascript
运行
复制
extern void sset_sort_sets(SSET *sets[], int n) {
    qsort(sets, n, sizeof(SSET *), sset_cmp);
}

sset_cmp()中,我放置了一个语句来打印它正在比较的SSET

代码语言:javascript
运行
复制
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...

我创建了一个由两个SSET组成的数组(在main()中)

代码语言:javascript
运行
复制
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]);

但我在输出中得到的是:

代码语言:javascript
运行
复制
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()打电话时搞砸了一些提示,但我不知道怎么做。

我想我把所有相关代码都包括进去了。告诉我如果还有其他片段你需要找出我的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-16 21:24:09

qsort()将指向数组元素的指针传递给比较函数。因此,如果您有一个int数组,则比较函数将接收int *

您正在尝试对指向SSET的指针数组进行排序,即SSET *数组。因此,比较函数将接收指向SSET (so,SSET **)的指针。

所以你需要改变这个:

代码语言:javascript
运行
复制
SSET *pa = (SSET *) a;
SSET *pb = (SSET *) b;

至:

代码语言:javascript
运行
复制
SSET *pa = *(SSET **) a;
SSET *pb = *(SSET **) b;

另外,不将类型名称硬编码为sizeof的操作数通常是个好主意。如果类型发生变化,这将是您将来必须更新的另一个地方,您可能会犯错误,因为您必须记住使用正确的类型。

考虑更改这一行:

代码语言:javascript
运行
复制
qsort(sets, n, sizeof(SSET *), sset_cmp);

至:

代码语言:javascript
运行
复制
qsort(sets, n, sizeof(sets[0]), sset_cmp);
票数 1
EN

Stack Overflow用户

发布于 2015-09-16 21:23:30

代码语言:javascript
运行
复制
SSET *pa = (SSET *) a;

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

代码语言:javascript
运行
复制
SSET *pa = *(SSET **)a;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32618857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档