c - 从 C 中的结构数组中检索结构以进行 qsort

标签 c arrays struct

我试图从结构数组中的结构中检索两个值,但我不知道我做错了什么。我需要这个来进行qsort

这是我的代码示例:

typedef struct test {
    int data1;
    int data2;
} *test;

然后我创建一个结构数组并返回指向该数组的指针:

test* foo(**some args**)
    test* array = malloc(sizeof(proc));
    int currentElement = 0;
    while(...){
        // get some data
        // and make space for struct
        array[currentElement] = malloc(sizeof(struct test));
        // add data to struct
        array[currentElement] -> data1 = ...;
        array[currentElement] -> data2 = ...;
        // resize array for the next wave of structs
        array = realloc(array, (currentElement + 1) * sizeof(struct proces));
        currentElement++;
    }
    return array

当我尝试访问并打印数组中的结构时,它可以工作(numberOfElement 是一个全局变量):

void printData(test* a) {
    printf("%s\n", "Data");
    int i;
    for (i = 0; i < numberOfElements; i++) {
        printf("%5d\n",
                a[i]->data1
                );
    }
}

但是,如果我尝试为 qsort 编写一个比较器函数,它会给我一个错误(请求非结构或 union 中的成员“data1”):

int comp (test* first, test* second){
    return first->data1 - second->data1;
}

编辑:添加返回指向结构数组的指针的函数 foo。 谢谢dasblinkenlight!

我还有一个问题:

这有效!

int comp (void *a, void* b){
    test* first = (test*)a;
    test* second = (test*)b;
    return (*first)->data1 - (*second)->data1;
}

当我尝试像这样对数组进行排序时:

test* a = foo(...);
qsort(a, numberOfElements, sizeof(test), comp);
printData(a);

它给了我一个错误:

warning: passing argument 4 of ‘qsort’ from incompatible pointer type [enabled by default]
In file included from Naloga2.c:2:0:
/usr/include/stdlib.h:765:13: note: expected ‘__compar_fn_t’ but argument is of type ‘int (*)(void *, void *)’
 extern void qsort (void *__base, size_t __nmemb, size_t __size,

编辑2:最终解决方案

int comp (const void *a, const void* b){
        test* first = (test*)a;
        test* second = (test*)b;
        return (*first)->data1 - (*second)->data1;
    }

最佳答案

问题是您的 typedeftest 定义为指针类型,而不是普通类型。那么test*就变成了一个双指针,即struct test**。当您编写 first->data1 时,您正在将 -> 运算符应用于指向 struct test 的指针,该指针不是指向一个结构

由于 test* 是一个双指针,因此您需要重写 comp 以在获取成员之前取消引用它一次,如下所示:

int comp (const void *a, const void* b){
    const test* first = (const test*)a;
    const test* second = (const test*)b;
    return (*first)->data1 - (*second)->data1;
}

您需要在内部传递 void* 并强制转换为 test*,因为 qsort 需要一个带有一对常量 void指针;简单地转换函数指针将编译并且甚至可能工作,但行为将是未定义的。

关于c - 从 C 中的结构数组中检索结构以进行 qsort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690100/

相关文章:

从文本文件创建数组并用 C 对其进行组织

c - 打印多维字符数组

c - 如何以相反的顺序打印二维字符串数组

c - C代码中的数组归零

Golang 将任何结构存储在其他结构字段中

c - 将具有未知数量元素的字符串扫描到 C 中的 int 数组

c - 监控chattr变化

java - 如何在JAVA类中填充数组

struct - 使用 CTFE 生成结构体别名集

c++ - 让 boost::function 引用我的函数对象