参数的不兼容类型和此函数中未初始化的

当我在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; } 

我通过此代码收到的错误是:

“’list_add’的参数2的不兼容类型”

“预期’结构书*’但参数类型为’结构书’”。

我试图解决这个问题,但是将book1更改为&book1正如另一个问题所建议的那样,但当我这样做时,我收到警告:

list在此function中未初始化”。

这是我应该初始化list

 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_init()函数。 在该函数中, list是函数的本地,对list本身所做的任何更改都不会反映到调用函数参数。

注意:C使用pass-by-value进行函数参数传递,因此对函数内部参数本身所做的任何更改都不会反映回调用函数中的参数。

现在在main()代码中, list是一个未初始化的局部变量,在调用list_init(list); 它仍然没有初始化,你的编译器正在抱怨。

你需要

  • 将指针传递给main()list变量,接受它作为指向struct list指针(即struct list ** list ),使用malloc()分配内存到*list

  • 将指向新分配的内存的指针返回给调用者并将其分配回实际指针。 在这种情况下,您将需要更改list_init()的返回类型。

问题:1:更改list_init的返回类型

 struct list* list_init() { list = malloc(sizeof(*list)); if(list != NULL) { list->head = NULL; list->num_books = 0; } return list; } 

并在main()这种方式调用它

 int main() { struct list * list; list = list_init(); 

问题:2:

在此之后的另一个问题是,在每次使用本地书籍副本并在list_add()中使用该指针时,在while循环中

  struct book book1; 

我建议每次都使用malloc,因此对于每个条目,你都会有单独的书副本