我在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()',这意味着有另一个内存泄漏。 –