You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:58:10