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

时间:2016-09-20 07:49:28

标签: 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)))
        {
            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;来自' list_add'"

     

"期待' 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)),但这给了我另一个错误。

2 个答案:

答案 0 :(得分:1)

基本问题在于您的list_init()功能。在该函数中,list是函数的本地函数,对list本身所做的任何更改都不会反映到调用函数参数。

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

现在,在您的main()代码中,list是一个未初始化的本地变量,在调用list_init(list);之后,它仍然未初始化,您的编译器正确抱怨。

你需要

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

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

答案 1 :(得分:0)

<强>问题: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,因此每个条目都要有单独的书副本