C: qsort() on struct array——返回垃圾

C: qsort() on struct array -- garbage is returned

我想使用 qsort() 库函数对结构数组进行排序。 我已经 man 3 qsort 通读,并参考了互联网上的其他资源,但没有成功。

我以为我已经确定 nmembsize 参数是正确的。

我还通过编写以下示例确保问题不是由我周围的代码引起的,而是来自我对 qsort() 缺乏理解:

#include <stdio.h>
#include <stdlib.h>

typedef struct example_structure {
    size_t a;
    size_t b;
} example_structure;

static int cmp_example_structure(const void *h1, const void *h2) {
    return (((example_structure *)h1)->a - ((example_structure *)h2)->a);
}

int main() {
    example_structure *example_structures = calloc(10, sizeof(example_structure));

    printf("sizeof(example_structures[0]) = %lu; sizeof(example_structure *) = %lu\n", sizeof(example_structures[0]), sizeof(example_structure *));

    fputc('\n', stdout);

    for(size_t h = 0; h < 10; h++) {
        example_structures[h].a = h;
        example_structures[h].b = h;
    }

    for(size_t h = 0; h < 10; h++) {
        printf("%ld ", example_structures[h].b);
    }

    fputc('\n', stdout);

    for(size_t h = 0; h < 10; h++) {
        printf("0x%lX ", example_structures[h].b);
    }

    fputc('\n', stdout);
    fputc('\n', stdout);

    qsort(example_structures, sizeof(example_structures[0]), 10, cmp_example_structure);

    for(size_t h = 0; h < 10; h++) {
        printf("%ld ", example_structures[h].b);
    }

    fputc('\n', stdout);

    for(size_t h = 0; h < 10; h++) {
        printf("0x%lX ", example_structures[h].b);
    }

    fputc('\n', stdout);

    free(example_structures);
}

我注意到返回的垃圾似乎被转移了:

0 1 2 3 4 5 6 7 8 9 
0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 

0 1 17179869184 6 34359738368 131072 1970346311811072 131072 1970324836974592 9 
0x0 0x1 0x400000000 0x6 0x800000000 0x20000 0x7000500000000 0x20000 0x7000000000000 0x9 

我该如何解决这个问题?

提前致谢。

您将 sizenmemb 参数倒置到 qsort。您告诉它您正在尝试对每个大小为 10 的 sizeof(example_structures[0]) 个元素进行排序,而不是对每个大小为 sizeof(example_structures[0]).

的 10 个元素进行排序

qsort(3): sort array - Linux man page 说:

void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

The qsort() function sorts an array with nmemb elements of size size. The base argument points to the start of the array.

如您所见,您应该将元素的数量指定为第二个参数,将一个元素的大小指定为第三个参数。

换句话说,

qsort(example_structures, sizeof(example_structures[0]), 10, cmp_example_structure);

应该是

qsort(example_structures, 10, sizeof(example_structures[0]), cmp_example_structure);