C 此函数中参数的类型不兼容且未初始化
我在C 此函数中参数的类型不兼容且未初始化,c,C,我在main()中调用一个或两个方法时遇到问题,我不确定原因 int main() { struct list * list; list_init(list); while(TRUE) { struct book book1; printf("Enter title of book: "); if(!getInput(book1.title, sizeof(book1.title))
main()
中调用一个或两个方法时遇到问题,我不确定原因
int main()
{
struct list * list;
list_init(list);
while(TRUE)
{
struct book book1;
printf("Enter title of book: ");
if(!getInput(book1.title, sizeof(book1.title)))
{
break;
}
printf("Enter author of book: ");
if(!getInput(book1.author, sizeof(book1.author)))
{
break;
}
printf("Enter dewey code of book: ");
if(!getInput(book1.deweycode, sizeof(book1.deweycode)))
{
break;
}
printf("Enter publisher code of book: ");
if(!getInput(book1.publisher, sizeof(book1.publisher)))
{
break;
}
printf("Enter ISBN code of book: ");
if(!getInput(book1.isbn, sizeof(book1.isbn)))
{
break;
}
list_add(list, &book1);
printf("\n");
}
printf("\n");
printf("Printing Linked List \n");
printList(list);
return EXIT_SUCCESS;
}
我收到的代码错误是:
“列表添加”的参数2的类型不兼容”
应为'struct book*',但参数的类型为'struct book'
我试图缓解此问题,但按照另一个问题的建议,将book1
更改为&book1
,但当我这样做时,我收到一个警告:
“列表
在此函数中未初始化”
这里是我应该初始化列表的地方
void list_init(struct list * list)
{
list = malloc(sizeof(*list));
if(list != NULL)
{
list->head = NULL;
list->num_books = 0;
}
}
这是书的结构:
struct book
{
char title[TITLELEN+1];
char author[AUTHORLEN+1];
char deweycode[DDCLEN+1];
char publisher[PUBLEN+1];
char isbn[ISBNLEN+1];
};
有人能帮忙解释一下为什么列表没有初始化吗?我也尝试过list*list=malloc(sizeof(*list))
但这给了我另一个错误。基本问题在于list\u init()
函数。在该函数中,list
是函数的本地变量,对list
本身所做的任何更改都不会反映到调用者函数参数中
注意:C使用传递值传递函数参数,因此对函数内参数本身所做的任何更改都不会反映回调用方函数中的参数
现在在main()
code中,list
是一个未初始化的局部变量,在调用list\u init(list)之后代码>它仍然保持未初始化状态,这正是编译器所抱怨的
你要么
- 将指针传递给
main()
中的list
变量,将其作为指向struct list
的指针接受(即struct list**list
),使用malloc()
将内存分配给*list
void list_init(struct list * list)
{
list = malloc(sizeof(*list));
if(list != NULL)
{
list->head = NULL;
list->num_books = 0;
}
}
将指向新分配内存的指针返回给调用者,并将其分配回实际指针。在这种情况下,您需要更改list\u init()
的返回类型
问题:1:
更改list\u init的返回类型
struct list* list_init()
{
list = malloc(sizeof(*list));
if(list != NULL)
{
list->head = NULL;
list->num_books = 0;
}
return list;
}
并在main()中以这种方式调用它
问题:2:
在这之后,另一个问题是,每次您获取书籍的本地副本并在list_add()中使用该指针时,都会在while循环中
我建议每次都向malloc咨询,因此对于每个条目,您都会有单独的图书副本正确,但我为什么需要这样做呢?:)如果不打算从list\u init
返回节点,则需要将list
的地址传递给list\u init
(例如void list\u init(结构列表**list)
。在我看来,更好的做法是提供在调用者中分配返回的灵活性,或者简单地传递列表的地址。(这是必需的,因为第一个节点的地址是列表的地址,您当前无法从列表\u init
)您可以执行列表*列表\u init(struct list**list)
同时返回list
以涵盖这两个基础。感谢您的回答!只是为了澄清我所做的一切都是正确的。您希望我在main()和函数list_init()中将struct list*list更改为struct list**list,这意味着我还必须更改list=malloc(sizeof(*(list))要列出*list=malloc(sizeof(*list))?@C.Smith No,在main()
中,您可以保留struct list*list;
,只需调用list_init(&list);
,将函数签名更改为void list_init(struct list**list)
,然后执行*list=malloc(sizeof(*list))
ooh,是的。我已经这样做了,但现在出现了另一个错误…“在非结构或联合中请求成员“head”。我以前没有遇到过这样的错误。@C.Smith好的,不用说,您必须将所有的列表
替换为*列表
。检查数据类型。我这样做了,它会产生比以前多得多的错误。但是,我最担心的是编译器的“*list->head”有问题即使我将其更改为“*list.head”,仍然存在一个问题。
struct book book1;