我正在尝试使用qsort对字符的指针数组进行排序,并在编译时不断出现分段错误。我将发布我的qsort调用和比较函数的代码,任何帮助将不胜感激。
//count declaration
size_t count = (sizeof (strPtrsQsort)/sizeof (*strPtrsQsort));
//function call
qsort ((char *)ptr, size, sizeof(char), compare);
//compare function
int compare (const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcmp (*ia, *ib);
}
答案 0 :(得分:0)
根据您的qsort
调用判断,您正在排序char
元素数组:基本指针类型作为qsort
传递给char *
,元素大小为sizeof(char)
。但是,您的比较函数是针对指针到char
的数组编写的。这是完全错误和不一致的。这就是导致崩溃的原因。
在随附的文本中,您声明您正在“尝试对指针数组进行排序”。为什么在这种情况下您将元素大小指定为sizeof(char)
而不是sizeof (char *)
?
答案 1 :(得分:0)
请注意,即使您需要使用C风格的原始数组,您仍然可以使用C ++ STL算法,因为指针实际上是RandomAccessIterators。例如,这有效:
#include <algorithm>
#include <iostream>
#include <cstring>
static
bool compare(const char *a, const char *b)
{
return std::strcmp(a, b) < 0;
}
int main()
{
const char *stringarray[] = {
"zyxulsusd",
"abcdef",
"asdf"
};
std::sort(stringarray, stringarray + 3, compare);
// -----------^
// Just like a normal iterator the end iterator points
// to an imaginary element behind the data.
for(int i = 0; i < 3; i++) {
std::cout << stringarray[i] << std::endl;
}
return 0;
}
这种方法的主要优点是类型安全,因此避免了像qsort
这样的C风格函数常见的大多数陷阱。