尝试在C中初始化结构时出错

尝试在C中初始化结构时出错,c,struct,C,Struct,C这里是初学者。我试图创建一个函数,返回我在头文件中定义的struct的新实例。我在列表\u create功能中执行此操作。当我试图编译我的代码时,我得到以下错误消息 错误:使用不兼容类型“void”的表达式初始化“ListNode”(也称为“struct ListNode”) 我在test.c文件中调用List\u create函数。感谢您的帮助,我很难掌握C的基本概念,但我正在努力学习 dll.h #包括 结构列表节点; 类型定义结构列表节点{ 结构ListNode*next; 结构List

C这里是初学者。我试图创建一个函数,返回我在头文件中定义的struct的新实例。我在
列表\u create
功能中执行此操作。当我试图编译我的代码时,我得到以下错误消息

错误:使用不兼容类型“void”的表达式初始化“ListNode”(也称为“struct ListNode”)

我在
test.c
文件中调用
List\u create
函数。感谢您的帮助,我很难掌握C的基本概念,但我正在努力学习

dll.h
#包括
结构列表节点;
类型定义结构列表节点{
结构ListNode*next;
结构ListNode*prev;
无效*值;
}列表节点;
类型定义结构列表{
整数计数;
ListNode*第一;
ListNode*last;
}名单;
List*List_create();
void add_to_back(列表*列表,void*值);
作废*从背面删除(列表*列表);
void将\添加到\前面(列表*列表,void*值);
作废*从_前端删除_(列表*列表);
作废*从_列表中删除_(列表*列表,列表节点*节点);
dll.c
#包括
列表*列表创建()
{
返回calloc(1,sizeof(List));
}
void添加到后面(列表*列表,void*值)
{  
ListNode节点=*calloc(1,sizeof(ListNode));
节点->值=值;
如果(列表->第一个==NULL){
列表->第一个=节点;
列表->最后一个=节点;
}否则{
列表->上一个->下一个=节点;
节点->上一个=列表->最后一个;
列表->最后一个=节点;
}
}
作废*从后面删除(列表*列表)
{
返回0;
}
void将\添加到\前面(列表*列表,void*值)
{
}
void*从\u前端删除\u(列表*列表)
{
返回0;
}
*从_列表中删除_(列表*列表,列表节点*节点)
{
返回0;
}
测试c
#包括
#包括
#包括
int test_add_to_back(){
List*List=List_create();
int新_值=1;
将\添加到\返回(列表和新\值);
ListNode*curr=list->first;
if(curr->value!=&new_值)返回0;
如果(list->first->value!=list->last->value | list->last->value!=new|u值)返回0;
将_添加到_后面(列表,2);
将_添加到_后面(列表,3);
将_添加到_后面(列表,4);
curr=列表->第一;
如果(list->last->value!=4)返回0;
//如果(curr->(void)*值!=1)返回0;
//当前=当前->下一步;
//如果(curr->(void)*值!=2)返回0;
//当前=当前->下一步;
//如果(curr->(void)*值!=3)返回0;
//当前=当前->下一步;
//如果(curr->(void)*值!=4)返回0;
返回1;
}
int main(){
printf(“helloworld\n”);
如果(test_add_to_back()!=1)printf(“add to back test failed\n”);
返回0;
}

calloc的返回类型为
void*
。因此,
*calloc(…)
属于
void
类型

ListNode node = *calloc(1, sizeof(ListNode));
相当于:

ListNode node = (void)(<<some vale>>);
更改:

ListNode node = * calloc(1, sizeof(ListNode));

还记得那件事吗

void *value;
如果你想做一些有用的事情,你需要做适当的打字 用它。实际上,
void*
用于多功能性。

calloc可以返回(void*)指针,您应该更改为:

列表*列表创建() { return(List*)calloc(1,sizeof(List)); } 某些编译器要求您执行适当的类型


谢谢那么为什么您可以将
void*
分配给
ListNode
?您不能。您可以将
void*
分配给
ListNode*
。我明白了,但为什么不反过来将
void
分配给
ListNode
?@DanielKobe,这需要一个很长的答案,太长,无法放入注释中。可能还有其他的SO问题可以解决这个问题。
void
是一种表示无值的类型。它没有价值
void*
是一个指针,指向任何特定的内容。。。但是它仍然是一个指针并且仍然有一个值是无用的。使用非原型风格的函数声明器是一个标准的问题。你能解释一下为什么它没用吗。你说的非原型风格的函数声明器是什么意思?我很有信心我提供了一个标准的链接来解释它。声明是没有用的,因为你会马上再次看到它。试着把它取下来看看。哦,我明白你的意思了。但是为什么函数声明器会过时呢?还有其他方法可以将函数放入我的头中吗?@DanielKobe在C中,用空的
()
声明函数意味着函数可以接受任意数量的参数,而应该使用
(void)
表示零参数。为什么要将CALLOC强制转换为ListNode*?@Michi:刚刚更正了它。我忽略了左侧,忽略了节点不是指针这一事实。
ListNode node = (void)(<<some vale>>);
ListNode *node = calloc(1, sizeof(ListNode));
ListNode node = * calloc(1, sizeof(ListNode));
ListNode *node = (ListNode*) calloc(1, sizeof(ListNode));
void *value;