我正在尝试按内存地址对指针数组进行排序:
#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
如有任何建议,我们将不胜感激!
最佳答案
您缺少一定程度的间接性: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;
}
关于c - 使用 Qsort 对 C 程序中的地址进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114652/