一直以为自己对指针了如指掌今天居然被指针卡住了。打算用qsort对一个结构体排序,结构体如下
typedef struct record_duration_element {
int start_times;
int end_times;
}record_duration_element;
排序代码如下
static record_duration_element *records[100];
int compares(const void *first, const void *second)
{
record_duration_element *fir = (record_duration_element *)first;
record_duration_element *sec = (record_duration_element *)second;
return sec->start_times - fir->start_times;
}
打算根据start_times对结构体从小到大排序,刚开始用qsort(records, 4, sizeof(record_duration_element), compares);结果排序出来完全不对,调试发现传进compares里的数据完全不对,开始还以为是待排序数据问题,或者是start_times不能是0或者负数(依稀记得qsort用快排,快排元素不能0或负数,其实都可以),折腾了十几分钟,结果发现还是不行。最后发现是指针问题。
1.qsort要求第一个参数是待排序的指针,第三个参数要求待排序的元素的大小,但是records其实是一个二重指针,所以第三个参数应该是待排序元素指针的大小而不是待排序元素的大小,所以应该是sizeof(record_duration_element*);其次是compares函数也有问题,参数fir,sen其实是个双重指针即(record_duration_element**),qsort第一个参数传双重指针所以fist也是二重指针,所以compares函数应该改成
int compares(const void *first, const void *second)
{
record_duration_element *fir = *(record_duration_element **)first;
record_duration_element *sec = *(record_duration_element **)second;
return sec->start_times - fir->start_times;
}
然后就对了,指针还是有点绕的,不过也就这点事,工作中没遇见过三重指针,所以掌握二重就够用了。