我试图从结构数组中的结构中检索两个值,但我不知道我做错了什么。我需要这个来进行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;
}
最佳答案
问题是您的 typedef
将 test
定义为指针类型,而不是普通类型。那么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/