C: qsort() on struct array——返回垃圾
C: qsort() on struct array -- garbage is returned
我想使用 qsort()
库函数对结构数组进行排序。
我已经 man 3 qsort
通读,并参考了互联网上的其他资源,但没有成功。
我以为我已经确定 nmemb
和 size
参数是正确的。
我还通过编写以下示例确保问题不是由我周围的代码引起的,而是来自我对 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
我该如何解决这个问题?
提前致谢。
您将 size
和 nmemb
参数倒置到 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);
我想使用 qsort()
库函数对结构数组进行排序。
我已经 man 3 qsort
通读,并参考了互联网上的其他资源,但没有成功。
我以为我已经确定 nmemb
和 size
参数是正确的。
我还通过编写以下示例确保问题不是由我周围的代码引起的,而是来自我对 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
我该如何解决这个问题?
提前致谢。
您将 size
和 nmemb
参数倒置到 qsort
。您告诉它您正在尝试对每个大小为 10 的 sizeof(example_structures[0])
个元素进行排序,而不是对每个大小为 sizeof(example_structures[0])
.
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);