C错误:无法获取类型' void'的左值的地址

时间:2016-04-07 21:10:21

标签: c arrays pointers

完整的错误消息

  

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 *));

1 个答案:

答案 0 :(得分:3)

remove功能的签名是

void remove(List *);
你在这里叫它:

arr2[i] = &(*remove)(list);

但由于返回值为void,它就像

// arr2[i] = &(void);

我认为你的意思是remove会返回一个指向被删除元素的指针,但是签名应该是:

void* remove(List *);

作为函数指针:

void* (*remove)(List *))