使用q排序分段错误?

时间:2014-10-09 18:07:26

标签: c++ qsort

我正在尝试使用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);
}

2 个答案:

答案 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风格函数常见的大多数陷阱。