所以我使用 qsort 根据我称之为"key"的结构中的 int 值对结构数组进行排序。但是,尽管我的数组已正确填充,但它似乎并没有对我的结构进行排序......
qsort 似乎从未调用我的比较函数。对函数中打印输出语句的简单测试表明了这一点。我的"测试"从未出现过。
比较功能:
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
sizeof(arr)
是指针的大小,因为arr struct Record *
定义。除以 1 struct Record
的大小,这很可能是 0。
假设您的文件仅包含记录,并且您正在读取整个文件,请使用 size->st_size/sizeof(struct Record)
。或者更好的是,因为您可能无论如何都需要其他地方的记录数,请在读取输入文件后设置一个变量并使用该变量。
传递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()
没有多大意义。