结构数组的qsort不起作用

我试图通过char对结构运行数组进行排序,但是当我打印数组时,没有任何内容被排序。 看看这个:

struct run { char name[20], weekday[4], month[10]; (And some more...) }; typedef struct run run; int name_compare(const void *a, const void *b) { run *run1 = *(run **)a; run *run2 = *(run **)b; return strcmp(run1->name, run2->name); } int count_number_of_different_persons(run results[]) { int i = 0; qsort(results, sizeof(results) / sizeof(run), sizeof(run), name_compare); for(i = 0; i <= 999; i++) { printf("%s\n", results[i].name); } // not done with this function yet, just return 0 return 0; } 

上面的输出只是按照最初放置的顺序列出的名称

 int count_number_of_different_persons(run results[]) 

这并不能让你在数组上使用sizeof ,因为数组会被衰减为指针。

这个

 run *run1 = *(run **)a; 

也看起来很奇怪,不应该

 run *run1 = (run*)a; 

一个问题是在name_compare 。 试试这个:

 int name_compare(const void *a, const void *b) { run *run1 = (run *)a; run *run2 = (run *)b; return strcmp(run1->name, run2->name); } 

检查以下代码:

正如@michel所提到的,sizeof(array)提供了指针的大小,而不是数组本身的大小,因为在传递数组时它被视为指针。 因此,要么将元素数发送到函数count_number_of_different_persons,要么定义元素数量的MACRO。 希望这可以帮助。 :)。

 #include  #include  #include  #define NOE 3 struct run { char name[20]; }; typedef struct run run; int name_compare (const void *a, const void *b ) { return strcmp (((run *)a)->name, ((run *)b)->name); } int count_number_of_different_persons(run results[], int noOfElements) { int i=0; qsort(results, noOfElements, sizeof (run), name_compare); for (i=0; i