如何使用qsort排序整数指针数组?现有实现排序未生效的问题排查
问题分析与修复方案
嘿,问题出在你的比较函数comp_list_asc里!你现在的逻辑是在比较指针的内存地址,而不是指针指向的数组元素的值,这就导致排序完全没按你预期的来。
为什么当前代码不生效?
你的数组int_list在内存中是连续存储的,所以指针地址的顺序固定是:&int_list[0] < &int_list[1] < &int_list[2]
而你的比较函数返回A - B(也就是指针地址的差值),qsort会认为这些指针本来就是升序排列的,自然不会做任何排序操作,所以输出还是原数组的顺序。
修复后的比较函数
你需要修改比较函数,让它比较指针指向的int值,而不是指针本身:
int comp_list_asc(const void *a, const void *b) { int *A = *(int **)a; int *B = *(int **)b; // 比较指针指向的数值,而非指针地址 if (*A < *B) return -1; if (*A > *B) return 1; return 0; }
如果追求简洁,也可以用return *A - *B;,但要注意:当*A和*B的差值超过int的范围时会产生溢出,所以上面的判断式写法更安全。
验证修复效果
修改后,list_elements_sorted返回的指针数组会按照元素值升序排列,也就是:sorted_list[0] = &int_list[1](指向2)、sorted_list[1] = &int_list[0](指向3)、sorted_list[2] = &int_list[2](指向5),和你的测试用例int_list_sorted完全匹配,assert_memory_equal会顺利通过。
另外补充:你的内存分配、assert检查以及测试函数中的free操作都是正确的,不需要改动~
内容的提问来源于stack exchange,提问作者TheDayAfterDark
相关产品推荐
相关产品推荐

