Dav*_*ldo 1 c struct pointers qsort
我试图弄清楚如何对结构中的指针数组进行排序,其中包含可能的空指针.但我无法理解它,并在排序后不断崩溃.
我有两个结构,CAR并且CARLIST:
CARLIST有一个指针数组CARS.而我无法做到对.
谢谢你的帮助...
typedef struct Car {
int parked_Total_Minutes;
char rz[10];
} CAR;
typedef struct CarList {
CAR **p_cars;
unsigned int count;
unsigned int size;
} CARLIST;
int Compare_ParkedTime(const void *a, const void *b) {
if (a == NULL)
return -1;
if (b == NULL)
return 1;
CAR *aa = *(CAR* const *)a;
CAR *bb = *(CAR* const *)b;
return (bb->parked_Total_Minutes < aa->parked_Total_Minutes) - (aa->parked_Total_Minutes < bb->parked_Total_Minutes);
}
int main() {
....
CARLIST *p_AllCars = (CARLIST *)malloc(sizeof(CARLIST));
p_AllCars->count = 0;
p_AllCars->size = 10;
p_AllCars->p_cars = malloc(p_AllCars->size * sizeof(CAR *));
for(int i = 0; i < p_AllCars->size; i++)
p_AllCars->p_cars[i] = NULL;
... other logic generating cars ...
qsort((void*)p_AllCars->p_cars, p_AllCars->size, sizeof(CAR*), Compare_ParkedTime);
...
}
Run Code Online (Sandbox Code Playgroud)
比较函数在要排序的数组中获取指针.您应该首先从该数组中读取指针,然后进行测试NULL.
如果两个指针都是,NULL并且可能使空指针大于其他值,则应返回0 .
以下是比较函数的更正版本:
int Compare_ParkedTime(const void *a, const void *b) {
/* read the pointer values */
CAR *aa = *(CAR * const *)a;
CAR *bb = *(CAR * const *)b;
/* sort NULL pointers to the end of the array */
if (aa == NULL)
return (bb != NULL);
if (bb == NULL)
return -1;
/* sort by increasing value of parked_Total_Minutes. swap aa and bb for decreasing order */
return (bb->parked_Total_Minutes < aa->parked_Total_Minutes) -
(aa->parked_Total_Minutes < bb->parked_Total_Minutes);
}
Run Code Online (Sandbox Code Playgroud)