1

ポインタの配列をメモリアドレスでソートしようとしています:

#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

どんな提案でも大歓迎です!

4

2 に答える 2

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;
}

しかし、ポインターがすべて同じ配列 (または最後を過ぎたもの) を指しているわけではないため、技術的には未定義の動作です。

于 2012-10-29T00:57:01.043 に答える
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;
}
于 2012-10-29T00:56:39.547 に答える