1

基本上我要做的是创建一个通用列表,我可以在其中使用void*to 将任何数据类型放入节点中。这是通用列表和我想要放入其中的结构。

typedef struct LIST{
  struct LIST *next;
  void *data;
} LIST;

struct person {
    char *name; 
    int age;
};

这是分配指针的函数

LIST *create_node(void *data, int size) {
    LIST *tmp;
    tmp = NULL;
    tmp = (LIST*)malloc(sizeof(LIST));
    tmp->data = malloc(size);
    tmp->data = data;
    memcpy(tmp->data, data, sizeof(data));
    tmp->next = NULL;
    return tmp;
}

这是我调用函数的create_node函数

void test_list() {
     LIST *my_list;
     struct person *my_person;
     my_list = NULL;

     my_person = (struct person*)malloc(sizeof(struct person));
     strcpy(my_person->name, "PABLO");
     my_person->age = 23;
     my_list = create_node(my_person, sizeof(struct person));
     printf("%d \n", my_list->data->age);
}

问题出现在我收到错误的最后一行:“成员年龄的请愿书不是结构或枚举”。我怎样才能摆脱这个问题?

4

2 回答 2

3

您已声明datavoid *. 如果您确定它确实指向 a person,那么您需要强制转换:

((struct person *)my_list->data)->age
于 2013-01-17T18:27:03.753 回答
0

我会做一些稍微不同的事情,但这里的具体错误在这个表达式中:

my_list->data->age

请记住,从 LIST 类型的声明中,类型my_list->datavoid *. 知道这个特定void *实际上指向一个struct person-- 但编译器不知道,也不知道这一点,因为这两个函数可能在不同时间编译的不同文件中。

因此,您需要明确告诉编译器这void *应该被视为struct person *使用类型转换:

((struct person *)my_list->data)->age
于 2013-01-17T18:41:12.180 回答