我在C中對dirent結構進行排序時遇到了問題。我嘗試了所有內容,無法獲取我的結構數組的值以顯示在我的比較中。我的代碼如下所示:無法使用qsort在C中對dirent進行排序
void printSortedNames(){
struct dirent **file_list = (dirent**)malloc(5 * sizeof(dirent*));
int i = 0;
for (i = 0; i < directory_size; ++i){
file_list[i] = (dirent*)malloc(50 * sizeof(dirent));
}
DIR *dir;
struct dirent *sd;
dir = opendir(".");
if (dir == NULL){
printf("Error! unable to open directory.\n");
exit(1);
}
int count = 0;
while ((sd = readdir(dir)) != NULL){
file_list[count] = sd;
printf("%s\n", file_list[count]->d_name);
++count;
}
size_t file_list_size = sizeof(&file_list)/sizeof(struct dirent);
qsort(file_list, file_list_size, sizeof(struct dirent), sizeCompare);
}
我創建了一個簡單的函數sizeCompare表明我的功能是工作,但我得到空值。我的功能如下:
int sizeCompare(const void* a, const void* b){
printf("%s\n", ((const struct dirent*)a)->d_name);
}
有人可以向我解釋爲什麼我的sizeCompare不能正確檢索數組值嗎?
更新: 我曾嘗試在qsort中調整大小,因此我的值不再爲空。下面的行給我一個輸出:
qsort(file_list, 1000, sizeof(struct dirent), sizeCompare);
顯然1000是不是一個好的解決方案。有人知道像這樣的數組的正確大小嗎?
UPDATE 2: sizeCompare函數只接受第一個參數,第二個參數爲null。
int sizeCompare(const void* a, const void* b){
const struct dirent *first_dirent = *(const struct dirent **) a;
const struct dirent *second_dirent = *(const struct dirent **) b;
.......
//first one works but second one is NULL
}
這一行:'file_list [count] = sd;'只複製一個指針。你實際需要的東西類似於:'memcpy(file_list [0],sd,sizeof(struct dirent));' – user3629249
你不需要轉換'void *'。 –
@ user3629249的確,這段代碼泄漏了內存。不僅如此,當OP取消引用時,'closedir()'將釋放所有指向數組中懸掛指針的指針,並導致*未定義的行爲。雖然代碼中沒有'closedir()',這意味着有另一個內存泄漏。 –