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;