所以我使用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
答案 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()
没有多大意义。