qsort比较函数没有被调用?

时间:2014-02-08 18:21:35

标签: c compare qsort

所以我使用qsort根据我称之为“key”的struct中的int值对结构数组进行排序。但是虽然我的数组已正确填充,但它似乎并没有对我的结构进行排序......

似乎qsort永远不会调用我的比较函数。函数内的print out语句的简单测试显示了这一点。我的“测试”从未出现过。

比较功能:

int compare (const void *a, const void *b){
    struct Record* a_r = (struct Record*)(a);
    struct Record* b_r = (struct Record*)(b);

   /*test*/
     printf("test");

    return (a_r->key - b_r->key);
}

我的qsort电话:

    qsort(arr, (sizeof(arr)/sizeof(struct Record)), sizeof(struct Record), compare);

我的比较功能有问题吗?或者我没有传递正确的变量?

我的阵列声明:

struct Record *arr = malloc(size->st_size); //where st_size is stat() of input file

2 个答案:

答案 0 :(得分:3)

sizeof(arr)是指针的大小,因为arr定义为struct Record *。除以一个struct Record的大小,这很可能是0。

假设您的文件只包含记录,并且您正在阅读整个文件,请使用size->st_size/sizeof(struct Record)。或者甚至更好,因为你可能还需要其他地方的记录数量,在读取输入文件后设置一个变量并使用该变量。

答案 1 :(得分:1)

您需要传递size->st_size / sizeof(struct Record)而不是sizeof(arr) / sizeof(struct Record),因为sizeof(arr)是指针的大小,并且通过推断,sizeof(Record)等于或大于一个指针(所以你将0或1个元素传递给qsort(),所以qsort()不需要调用比较器,因为大小为0或1的数组已经被排序了。

据推测,size->st_size是固定长度记录文件的大小,每个记录都是struct Record。否则,malloc()没有多大意义。

相关问题