我有这样的结构:
typedef struct item{
char label[10];
int support;
};
我创建了一系列这样的结构:
struct item* finstr = (struct item*)malloc(sizeof(struct item)*10);
我用适当的值填充数组,并希望使用qsort函数根据'support'的值对数组进行排序。但是,阵列根本没有排序。输出结果与输入相同。
这里是对qsort函数的调用和'比较器'函数的代码:
qsort((void*)finstr,(sizeof(finstr)/sizeof(finstr[0])),sizeof(finstr[0]),comparator);
比较器功能:
int comparator(const void* i1,const void* i2) {
int l = ((struct item*)i1)->support;
int r = ((struct item*)i2)->support;
return l-r;
}
我不明白我在哪里弄错了。任何帮助是极大的赞赏。
提前致谢。
答案 0 :(得分:1)
除非(sizeof(finstr)/sizeof(finstr[0]))
是数组,否则表达式finstr
不会提供元素数量。在您的情况下,它的评估结果为sizeof(void*)/sizeof(struct item)
,最有可能是0
。
将其替换为10
。
来自@ForhadAhmed的优秀建议:
将
10
替换为malloc(sizeof(struct item)*10)
中的qsort
以及使用宏或变量传递给qsort
函数的数组的大小,以便不小心调用{ {1}}具有与您预期不同的大小数组。
答案 1 :(得分:0)
尝试构建并运行以下内容,以查看您得到的答案:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char bar[123];
int baz;
} foo;
int main(int argc, char** argv) {
foo *foo_ptr = malloc(sizeof(foo) * 1000);
fprintf(stdout, "%zu\n", sizeof(foo_ptr));
fprintf(stdout, "%zu\n", sizeof(foo_ptr[0]));
free(foo_ptr);
return 0;
}
根据体系结构,您可能会注意到sizeof(foo_ptr)
是八个字节 - foo
指针的大小称为foo_ptr
。将其与sizeof(foo_ptr[0])
的值进行比较。这应该提供一个错误的提示。