C语言将const void*强转为字符串时出现不兼容指针类型错误如何解决
错误根源分析
你的写法存在两个核心问题:
- 强转逻辑错误,且丢失
const修饰符:p1是const void*类型,&p1是const void**类型,你直接强转为char**丢弃了const限定,所以编译器会抛出指针类型不兼容的错误。 - 对比较函数的传参语义理解错误:如果是配合
qsort使用的比较函数,传入的p1/p2本身就指向待排序数组的单个元素,你取&p1拿到的是形参p1自身在栈上的地址,和实际待比较的数据完全无关,就算强转语法修好了,运行也会出现段错误。
正确实现方案
为什么需要先转Student*?
qsort是通用排序接口,为了兼容所有类型的数组,它的比较函数参数统一用void*承接数组元素的指针。编译器不知道void*指向的实际数据类型,你明确当前要排序的是Student类型的数组,所以需要手动强转为const Student*,才能合法访问结构体内部的firstname字段。
可用的比较函数代码
int compareFirstName(const void * p1, const void * p2) { const Student* s1 = (const Student*)p1; const Student* s2 = (const Student*)p2; return strcmp(s1->firstname, s2->firstname); }
拓展:排序字符串数组的写法
如果你要排序的是元素为char*的字符串数组,才需要用到二级指针转换,写法如下:
int compareStr(const void * p1, const void * p2) { // 直接转换p1的值,不需要取p1的地址 const char* str1 = *(const char**)p1; const char* str2 = *(const char**)p2; return strcmp(str1, str2); }
内容的提问来源于stack exchange,提问作者aerialace8
相关产品推荐
相关产品推荐

