我使用来自C libary的qsort,我有数据类型
Element_type **pElement and Element_type is struct typedef element_type {int ,char ....}
示例,我用
调用quicksor函数qsort(*pElement,iCountElement,(size_t)sizeof(Element_type),compare);
和回调函数
static int compare(const void *p1, const void *p2) {
Element_type *a1 = (Element_type *)p1;
Element_type *a2 = (Element_type *)p2;
return ( (a2)->iServiceId < (a1)->iServiceId );
}
但我总是得到分段错误。为什么呢?
答案 0 :(得分:3)
您的比较函数应返回elem1是否被认为小于,等于或大于elem2,分别返回负值,零或正值。
此外,如果您要对Element_Type
数组进行排序,则可以将void*
转换为Element_Type*
类型。如果您尝试排序的元素为Element_Type*
,那么您可以将void *转换为Element_Type**
。
如果您要排序的项目类型为Element_Type*
,请确保为每个项目分配内存,然后在调用qsort之前为每个项目初始化。
答案 1 :(得分:1)
pElement = (Element_type *)malloc(sizeof(Element_type )* iiNewSize);
你应该调用qsort(pElement,...),而不是qsort(* pElement,...)。帖子顶部的pElement声明不准确。
答案 2 :(得分:0)
static int compare(const void *p1, const void *p2) {
Element_type *a1 = *(Element_type *)p1;
Element_type *a2 = *(Element_type *)p2;
if( (a1)->iServiceId < (a2)->iServiceId )
{
return -1; // this means that a1 < a2 in your criteria
}
if( (a1)->iServiceId == (a2)->iServiceId )
{
return 0; // this means that a1 == a2 in your criteria
}
return 1; // this means that a1 > a2 in your criteria
}
像这样调用qsort:
qsort(pElement,iCountElement,(size_t)sizeof(Element_type),compare);
LATER EDIT:为我们提供一段代码,以便我们可以看到更多问题,如果是这样的话
答案 3 :(得分:0)
这是纠正比较功能的最简单方法:
static int compare(const void *p1, const void *p2) {
Element_type *a1 = (Element_type *)p1;
Element_type *a2 = (Element_type *)p2;
- return ((a2)->iServiceId < (a1)->iServiceId );
+ return (a1->iServiceId) - (a2->iServiceId);
}
我无法阅读第一个代码段,因此我不会对您的段错误提出建议。