为什么qsort不能在我的代码中工作?

时间:2012-10-19 13:43:02

标签: c

我的代码是只用一个字段对结构进行排序。

奇怪的是,当长度为8但不在时,它可以工作 9.为什么会这样,有什么不对?

struct node
{
   int key;//I need to sort by the key
   int val;
};
int comp(const void *a, const void *b)
{
return ((struct node *)a)->key > ((struct node *)b)->key;
}
int main()
{
    int i;
    struct node *a;
    a = malloc(10 * sizeof *a);
    /*I have 8 elements*/
    for (i = 0; i < 6; i++)
         a[i].key = 22;
    a[6].key = 21;
    a[7].key = 20;
    a[8].key = 10;
    /*Before sorting, I print it first*/
    for (i = 0; i < 9; i++)
    printf("%3d", a[i].key);
    printf("\n");
    qsort(a, 9, sizeof(struct node), comp);
    /*The sorted answer*/
    for (i = 0; i < 9; i++)
       printf("%3d", a[i].key);
    printf("\n");
    free(a);
    return 0;
}

输出是:

22 22 22 22 22 22 21 20 10

10 22 22 22 22 22 21 20 22

但是当我将长度更改为8时,它可以正常工作。

3 个答案:

答案 0 :(得分:4)

你的意思是&#34;长度&#34;?

  • 您为10个元素分配空间。
  • 你排序了其中的9个。
  • 你打印其中9个。

这段代码非常令人困惑。您需要对您使用了多少元素有一个明确定义的概念,并在任何地方使用相同的元素。提示:它不应该是字面数字。

另外,你的比较函数是错误的,它需要为小于,等于或大于的元素返回-1,0或1。你的函数只会返回0或1。

答案 1 :(得分:2)

根据两个参数的关系,您的比较应该返回小于,等于或大于零的值。例如:

int comp(const void *a, const void *b)
{
  int key_a = ((struct node *)a)->key;
  int key_b = ((struct node *)b)->key;
  if (key_a<key_b) return -1;
  if (key_a>key_b) return 1;
  return 0;
}

答案 2 :(得分:0)

请仔细阅读 几次qsort man page。在Linux上,键入man qsort。 如果使用GCC,请将-Wall -g传递给gcc,以获取警告和调试信息。 (使用其他编译器,启用所有警告和调试信息)。

malloc之后,您最好使用memset清除整个区域。实际上,您应该使用calloc之类的

a = calloc (10, sizeof(*a));
if (!a) 
  perror("calloc a"), exit(EXIT_FAILURE);

回想一下始终应该测试 callocmalloc的结果!

比较器函数获取要比较的事物的地址,并且应该返回一个整数(0表示相等,负数表示小于,大于正数)。

int comp(const void *a, const void *b)
{
   const struct node* na = (const struct node*) a;
   const struct node* nb = (const struct node*) b;
   return na->key - nb->key;
}

请学习使用调试器(如Linux上的gdb)。