2014-10-09 23 views
-1

我正在尝试使用qsort对字符指针数组进行排序,并在编译时保持出现分段错误。我会发布我的qsort调用的代码和比较函数和任何帮助将不胜感激。使用q sort进行分段错误?

//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

什么是'count',什么是'strPtrsQsort',并且他们目前的代码片段你贴? 'qsort'中没有任何地方使用它们。 – AnT 2014-10-09 18:19:51

+2

为什么在C++中使用C字符串,原始数组和C的'qsort'?使用'std :: vector '和'std :: sort'。 – crashmstr 2014-10-09 18:21:57

+1

如果你想对一个指针数组进行排序,为什么数组元素的大小作为'sizeof(char)'传递给'qsort'?如何声明'ptr'?为什么在传递给'qsort'之前将它转换为'char *'? – AnT 2014-10-09 18:24:12

回答

0

通过您的呼叫qsort来看,正在排序char元件的阵列:基指针类型传递给qsort作为char *值和元素大小为sizeof(char)。但是,您的比较函数是针对指针char的数组写入的。这完全不正确和不一致。这是造成这次事故的原因。

在相应的文本你的国家,你是“试图理清字符指针数组”。为什么在这种情况下你指定的元素大小为sizeof(char)而不是比如sizeof (char *)

+0

感谢您的帮助。我对指点者非常陌生,他们只是在引用引用。这有很大帮助。 – Asron 2014-10-09 18:46:31

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; 
} 

这种方法的主要优点是类型安全和避免了由此与C风格的功能,如qsort最常见的陷阱。

+0

我不确定'stringarray [3]'是否有效,即使你只是取其地址。 – 2014-10-10 00:04:31

+0

http://stackoverflow.com/questions/26289918/is-an-valid-where-n-is-the-size-of-the-array – 2014-10-10 00:08:35

+0

改为替代语法 – dom0 2014-10-10 00:36:55