参数类型不兼容且在此函数中未初始化

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 好的,不用说,您必须将 alllists 替换为 *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时才起作用

* 类型的 C 参数与 * 类型的参数不兼容

Cython __pyx_r 可能在此函数中未初始化使用

“void(*)(int wall)”类型的 C++ 参数与“int”类型的参数不兼容

TypeScript 类型推导及类型兼容性

java 怎么往构造函数里面传递参数