2009-08-27 103 views
2

試圖按照this的例子。 (部分字符串排序...)
是否有任何明顯的,會在stdlib的qsort.c這崩潰?
我也試過cstring_cmp與strncmp指定最多30個字符,比我有更多。
* fileArray [20]似乎正確填充字符串。
謝謝。qsort崩潰程序 - C

char* ptr_fileName; 
char* fileArray[20];//number of files 
size_t strings_len; 

ptr_fileName = (char*)malloc((strlen(FindFileData.cFileName)+1)*sizeof(char)); 
memcpy(ptr_fileName, FindFileData.cFileName, strlen(FindFileData.cFileName)+1); 
fileArray[i] = ptr_fileName; 



strings_len = sizeof(fileArray)/sizeof(char *);   
qsort(fileArray, strings_len, sizeof(char *), cstring_cmp); 
//crashing in qsort.c 

快速排序C-字符串比較功能:

/* qsort C-string comparison function */ 
    int cstring_cmp(const void *a, const void *b) 
    { 
     const char **ia = (const char **)a; 
     const char **ib = (const char **)b; 
     return strcmp(*ia, *ib); 
     /* strcmp functions works exactly as expected from 
     comparison function */ 
    } 
+0

爲什麼你的問題標記爲C++?這是C代碼,你正在以(硬)C方式進行。 – sbi 2009-08-27 18:06:55

+0

你可以顯示你用來初始化字符串的代碼嗎? – 2009-08-27 18:09:09

+0

也許他使用C++編譯器來編譯代碼,並且標準(也許)有不一致的地方,比如單元化內存被填滿。這_matters_。 – 2009-08-27 18:09:12

回答

4

你說你只用10個字符串填充fileArray,剩下10個條目未初始化。

當你調用qsort時,你傳遞20作爲strings_len參數。 這當然會導致未定義的行爲。

你必須給qsort準確的信息。

如果要在數組中傳遞10個字符串,則還必須傳遞數字10作爲要排序的元素數。

注: 如果你按照我剛纔的答覆,在cstring_cmp設置斷點,你會很快看到當比較方法被稱爲無效數據,直接導致飛機墜毀。

2

你如何填充:

char* fileArray[20]; 

因爲它的立場,這是未初始化數組的指針。

+0

添加了如何填充陣列。 – 2009-08-27 18:10:40

+0

不,你沒有。發佈完整的真實代碼。 – 2009-08-27 18:13:44

1

*fileArray[20] seems to be correctly populated with strings.

fileArray之前的星號讓我懷疑您填充數組的方式的正確性。 我沒有看到任何可能會破壞你的代碼的東西。

0

由於您沒有初始化fileArray的內容,它合法的包含隨機內存,而不是合法的字符指針。

2

在cstring_cmp中設置一個斷點,並且每次都會調用它。

看看最終崩潰發生在cstring_cmp還是qsort中。 檢查崩潰前fileArray的狀態。