完整的错误消息
dll.c:89:13:错误:无法获取类型' void'的右值的地址 arr2 [i] =&(*删除)(列表);
我的函数应该有4个参数,一个两个数组,一个长度值,一个删除函数和一个插入函数。然后它获取第一个数组的值并将它们放在链表中。然后它从链表中删除值并将它们插入到第二个数组中。我遇到问题的部分是将值插入第二个数组。我知道问题与我对指针的理解有关。我知道数组是void *
而我的remove函数返回void *
所以最初我尝试了arr2[i] = (*remove)(list)
但我也遇到了编译器错误。所以我添加&
只是因为这似乎在过去工作(我知道不是一个很好的理由),现在我得到了这个错误。谢谢你的帮助。
void transfer(char *arr1, char *arr2, int length, void (*insert)(List *, void *), void* (*remove)(List *)) {
List *list = List_create();
for (int i=0; i < length; i++) {
(*insert)(list, &arr1[i]);
}
for (int i=0; i < length; i++) {
arr2[i] = &(*remove)(list);
}
}
标头文件
#include <stdlib.h>
typedef struct ListNode {
struct ListNode *next;
struct ListNode *prev;
void *value;
} ListNode;
typedef struct List {
int count;
ListNode *first;
ListNode *last;
} List;
List *List_create(void);
void add_to_back(List *list, void *value);
void *remove_from_back(List *list);
void add_to_front(List *list, void *value);
void *remove_from_front(List *list);
void transfer(void *arr1, void *arr2, int length, void (*insert)(List *, void *), void* (*remove)(List *));
答案 0 :(得分:3)
remove
功能的签名是
void remove(List *);
你在这里叫它:
arr2[i] = &(*remove)(list);
但由于返回值为void
,它就像
// arr2[i] = &(void);
我认为你的意思是remove会返回一个指向被删除元素的指针,但是签名应该是:
void* remove(List *);
作为函数指针:
void* (*remove)(List *))