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

C语言qsort比较函数:两个return差异及void*转char**的原因

C语言qsort字符串数组排序问题解答

1. 两个return语句的差异

  • 错误写法 return strcmp(c1, c2):这里c1是把void* a直接强转为char*,相当于把数组元素的内存地址(也就是指向char*的指针值)当成了字符串的起始地址。strcmp会从这个地址开始读取字节当作字符串,要么触发非法内存访问崩溃,要么读出乱码,完全实现不了字符串排序的需求。
  • 正确写法 return strcmp(*str1, *str2):str1是char**类型,解引用*str1后得到的是数组中存储的真正字符串指针char*,也就是要比较的字符串的起始地址。strcmp通过它比较两个字符串的内容,这才是qsort排序字符串数组的正确逻辑。

2. 为何要转换为(char**)而非直接转(char*)

你排序的是字符串数组,比如char* words[] = {"apple", "banana"},数组里的每个元素都是char*类型的指针。qsort回调函数的参数a和b,本质是数组中每个元素的地址——因为元素是char*,所以元素的地址自然是char**类型。

如果直接转成char*,你拿到的不是字符串的起始地址,而是数组里那个char*变量本身的内存地址,把这个地址传给strcmp完全错误,根本找不到要比较的字符串内容。只有转成char**,再解引用一次,才能拿到指向目标字符串的char*指针,让strcmp正常执行字符串比较。

内容的提问来源于stack exchange,提问作者obanby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:07:09