qsort常量指针编译报错求助:强制转换丢弃const限定符
解决强制转换丢弃const限定符的编译错误
这个错误的核心是你在转换qsort的const void*参数时,没有正确保留所有层级的const限定符。我直接给你修正后的代码,再详细拆解问题原因:
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> STATIC int compare(const void *p1, const void *p2) { // 正确转换:保留两层const限定 const char *pp1 = *(const char * const *)p1; const char *pp2 = *(const char * const *)p2; return strcmp(pp1, pp2); } // 示例调用上下文 void your_function() { char **av; size_t ac; // 注意:标准C里是小写size_t,而非SIZE_T char WordCopy[256] = {0}; const char *p = "sample_word"; // 示例p的定义 av[ac] = strdup(p); qsort(av, ac, sizeof(char *), compare); }
错误原因详解
qsort传给compare函数的p1、p2是const void*,它们指向的是排序数组中的不可修改的元素。你的数组元素是char*类型,所以p1实际指向的是一个const char*——意思是你不能修改数组里的指针本身,只能读取它指向的字符串。
原来的转换*(const char **)p1有问题:const char**表示“指向非const char指针的指针”,但p1指向的是不可修改的char指针,这个转换直接丢弃了外层的const限定符,因此触发编译错误。
正确的转换类型const char * const*的含义:
- 最内层
const char*:保证读取的字符串不可修改,符合strcmp的参数要求 - 中间的
const*:保证p1指向的数组元素(char*)不可修改,符合qsort传递const元素的语义
额外优化提示
- 标准C中类型名是
size_t,而非大写的SIZE_T,后者是部分平台的非标准定义,改成小写能提升代码可移植性 - 务必确保
av已经提前分配了足够的内存,否则av[ac] = strdup(p)会导致未定义行为
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

