问题与qsort在c

时间:2015-03-25 06:25:04

标签: c arrays sorting qsort

我有这样的结构:

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

我不明白我在哪里弄错了。任何帮助是极大的赞赏。

提前致谢。

2 个答案:

答案 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])的值进行比较。这应该提供一个错误的提示。