2014-10-09 58 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