使用C语言qsort函数出现函数指针类型不兼容错误的解决方法
qsort函数指针类型不兼容问题修正
原代码
int cmp_arv(struct train *t1, struct train *t2) { return (t1->arv - t2->arv); } void prepare_data(void) { int i; for (i = 0; i < nconn; i++){ rtrains[i].from = trains[i].to; rtrains[i].to = trains[i].from; rtrains[i].dpt = BIAS- trains[i].arv; rtrains[i].arv = BIAS- trains[i].dpt; rtrains[i].fare = trains[i].fare; } qsort (trains, nconn,sizeof(struct train), cmp_arv); qsort (rtrains, nconn, sizeof(struct train), cmp_arv); }
错误信息
incompatible function pointer types passing 'int (struct train *, struct train *)' to parameter of type 'int (* _Nonnull)(const void *, const void *)' [-Wincompatible-function-pointer-types]
问题原因
qsort的比较函数参数要求是**const void*类型**,这是为了保证通用性(适配任意数据类型的排序需求)。你定义的cmp_arv函数参数是struct train*,和qsort要求的函数指针类型不匹配,因此编译器抛出类型不兼容的错误。
修正后的代码
修改比较函数的参数类型为const void*,并在函数内部安全强制转换为const struct train*,同时保留原有排序逻辑:
int cmp_arv(const void *a, const void *b) { const struct train *t1 = (const struct train *)a; const struct train *t2 = (const struct train *)b; // 若arv为大整数类型(如long),直接减法可能溢出,建议用下面的判断逻辑 return t1->arv - t2->arv; } void prepare_data(void) { int i; for (i = 0; i < nconn; i++){ rtrains[i].from = trains[i].to; rtrains[i].to = trains[i].from; rtrains[i].dpt = BIAS - trains[i].arv; rtrains[i].arv = BIAS - trains[i].dpt; rtrains[i].fare = trains[i].fare; } qsort(trains, nconn, sizeof(struct train), cmp_arv); qsort(rtrains, nconn, sizeof(struct train), cmp_arv); }
溢出安全版本(可选)
如果arv是可能溢出的整数类型(如long),建议改用判断逻辑避免溢出:
int cmp_arv(const void *a, const void *b) { const struct train *t1 = (const struct train *)a; const struct train *t2 = (const struct train *)b; if (t1->arv < t2->arv) return -1; if (t1->arv > t2->arv) return 1; return 0; }
内容的提问来源于stack exchange,提问作者mann
相关产品推荐
相关产品推荐

