我正在尝试使用qsort对几个不同的int数组进行排序,但它似乎没有执行排序。这是我的比较器函数,一个用于向前排序,一个用于向后排序:
int comp(const void *elem1, const void *elem2){
int x = *(int*)elem1;
int y = *(int*)elem2;
if(x > y) return 1;
if (x < y ) return -1;
return 0;
}
int compReverse(const void *elem1, const void *elem2) {
int x = *(int*)elem1;
int y = *(int*)elem2;
if (x > y) return -1;
if (x < y) return 1;
return 0;
}
这是我调用qsort的地方。要排序的项目是malloc'ed int * s。 NELEMS是一个#define,它将数组的总字节大小除以int的大小以获得数组长度。
qsort(ascendingOrderArray, NELEMS(ascendingOrderArray),
sizeof(*ascendingOrderArray),comp);
qsort(descendingOrderArray, NELEMS(descendingOrderArray),
sizeof(*descendingOrderArray), compReverse);
当我遍历新数组时,它们不符合我的预期。事实上,除了第一个数字的位置之外,它们根本没有顺序,并且与未排序的数组无法区分。这是怎么回事?
答案 0 :(得分:4)
您说ascendingOrderArray
是通过malloc()
分配的,因此定义必须是:
int *ascendingOrderArray;
但是你说NELEMS()
被定义为将数组的大小除以int的大小,所以我假设定义是这样的:
#define NELEMS(x) (sizeof(x) / sizeof(int))
如果是这种情况,则代码不会按照您的想法执行。这里,sizeof(ascendingOrderArray)
是指针的大小(以字符为单位[1])(在32位系统上,该值很可能是4;在64位系统上, 8)。然后将它除以整数的大小(32位系统最可能是4; 64位系统它可能是4,可能是8 ---它取决于编译器)。如果NELEMS()
返回值1,我不会感到惊讶,这不会给qsort()
很多工作。
您需要做的是致电qsort()
,如:
qsort(ascendingOrderArray,itemsInArray,sizeof(int),comp);
其中itemsInArray
是分配数组中元素数量的单独计数。
[1]在C中,sizeof()
返回相对于char大小的类型大小;根据定义,sizeof(char)
为1。在大多数现代系统中,这也是一个字节,但它不一定是。