我试图通过内存地址对指针数组进行排序:
#include <stdio.h>
#include <stdlib.h>
typedef struct flist {
int size;
struct flist *blink;
struct flist *flink;
} *Flist;
int compare(const void *x, const void *y)
{
Flist a = (Flist)x;
Flist b = (Flist)y;
if(a < b)
return -1;
else
return 1;
}
int main()
{
int a[] = {3, 1, 2, 4, 0};
Flist b[5];
int i;
for(i = 0; i < 5; i++)
b[a[i]] = (Flist)malloc(12);
printf("Here is the array before sorting:\n");
for(i = 0; i < 5; i++)
printf("%p\n", b[i]);
qsort(b, 5, sizeof(Flist), compare);
printf("Here is the array after sorting:\n");
for(i = 0; i < 5; i++)
printf("%p\n", b[i]);
}
但是,该程序对地址的顺序没有影响:
这是排序前的数组:
0x759090
0x759030
0x759050
0x759010
0x759070
这是排序后的数组:
0x759090
0x759030
0x759050
0x759010
0x759070
任何建议都会非常感谢!
答案 0 :(得分:2)
compare
接收数组元素的地址。这些当然已经按顺序进行了。
要按值排序,您需要将compare
更改为
int compare(const void *x, const void *y)
{
Flist a = *(Flist*)x;
Flist b = *(Flist*)y;
if(a < b)
return -1;
else if (a == b)
return 0;
else
return 1;
}
但由于指针并非都指向同一个数组(或者指向一个结尾),因此它在技术上是未定义的行为。
答案 1 :(得分:1)
您缺少一个间接级别:qsort
发送正在排序的元素的地址,而不是元素本身。
在您的情况下,您将看到传递的Flist
元素地址的地址。在转换为Flist*
(指向指针的指针)之后,您需要取消引用传入的指针:
int compare(const void *x, const void *y) {
Flist a = *((Flist*)x);
Flist b = *((Flist*)y);
if(a < b)
return -1;
else
return 1;
}