参数类型不兼容且在此函数中未初始化
Posted
技术标签:
【中文标题】参数类型不兼容且在此函数中未初始化【英文标题】:Incompatible type for argument and uninitialised in this function 【发布时间】:2016-09-20 07:49:28 【问题描述】:当我在 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 的类型不兼容"
“预期为'struct book *',但参数的类型为'struct book'”。
我已尝试缓解此问题,但按照另一个问题的建议将 book1
更改为 &book1
但是当我这样做时会收到警告:
“
list
在此函数中未初始化”。
这是我应该初始化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_init
(例如void list_init(struct list **list)
。这样做要好得多在我看来,无论是提供在调用者中分配返回的灵活性,还是简单地传递列表的地址。(这是必需的,因为 第一个节点的地址是您目前无法从list_init
返回的列表)您可以在返回list
的同时执行list *list_init(struct list **list)
以涵盖这两个基础。
【参考方案1】:
基本问题在于您的list_init()
函数。在该函数中,list
是该函数的本地函数,对 list
本身所做的任何更改都不会反映到调用者函数参数。
注意:C 使用按值传递函数参数传递,因此函数内部对参数本身所做的任何更改都不会反映回调用函数中的参数。 p>
现在在您的 main()
代码中,list
是一个未初始化的局部变量,在调用 list_init(list);
之后它仍然保持未初始化,您的编译器正确地抱怨这一点。
你需要
在main()
中传递一个指向list
变量的指针,接受它作为指向struct list
的指针(即struct list ** list
),使用malloc()
向*list
分配内存。
将指向新分配内存的指针返回给调用者,并将其分配回实际指针。在这种情况下,您将需要更改 list_init()
的返回类型。
【讨论】:
感谢您的回答!只是为了澄清我做的一切都是正确的。您希望我在 main() 和我的函数 list_init() 中将 struct list * list 更改为 struct list ** list,这意味着我还必须将 list = malloc(sizeof(*(list)) 更改为 list * list = malloc (sizeof(*list))? @C.Smith 不,在main()
可以保留struct list * list;
,只需调用list_init(&list);
,将函数签名更改为void list_init(struct list * *list)
,然后执行* list = malloc(sizeof(**list))
哦,是的。我已经这样做了,但是现在出现了另一个错误……“在不是结构或联合的东西中请求成员'头'”。我以前没有遇到过这样的错误。
@C.Smith 好的,不用说,您必须将 all 的 lists
替换为 *list
。检查数据类型。
我已经这样做了,它产生的错误比以前多得多。但是,我最担心的是编译器的“*list->head”存在问题,即使我将其更改为“*list.head”,仍然存在问题。【参考方案2】:
问题: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:
在此之后,另一个问题是每次在 while 循环中获取书籍的本地副本并在 list_add() 中使用该指针
struct book book1;
我建议每次都使用 malloc,所以对于每个条目,您都会有单独的书籍副本
【讨论】:
正确,但是为什么我需要这样做? :)以上是关于参数类型不兼容且在此函数中未初始化的主要内容,如果未能解决你的问题,请参考以下文章
模板函数替换仅在一个参数中未使用std :: function时才起作用