2016-09-20 43 views
1

我有一个/两个我的方法时,我在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在这个函数中未初始化”。

这里是我应该初始化的地方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)),但那给了我另一个错误。

+0

如果你不打算从'list_init'返回一个节点,那么你需要将'list'的地址传递给'list_init'(例如'void list_init(struct list ** list)'。在我看来,提供灵活性来分配呼叫者的回报,或者简单地传递清单的地址,这两者都会更好。 (这是必需的,因为第一个节点的*地址*是列表*的地址*,您目前无法从'list_init'返回)您可以执行'list * list_init(struct list ** list)'while返回'list'包含两个基础。 –

回答

1

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

注意:C为函数参数传递使用了传递值,所以在函数内对参数本身所做的任何更改都不会反射回调用函数中的参数。

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

您需要要么

  • 的指针传递给list变量main(),接受它作为一个指针来指向struct list(即,struct list ** list),采用malloc()分配内存以*list

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

+0

谢谢你的回答!只是为了澄清我正在做的一切正确。你希望我在main()和我的函数list_init()中将struct list * list更改为struct list **列表,这意味着我还必须将list = malloc(sizeof(*(list))更改为list * list = malloc (sizeof(* list))? –

+0

@ C.Smith不,在'main()'中可以保留'struct list * list;',只需调用'list_init(&list);',将函数签名更改为void list_init(struct list * * list)'然后执行'* list = malloc(sizeof(** list))' –

+0

Ooooh,是的,我已经这样做了,但现在我又出现了一个错误...“请求会员” '不是一个结构或联盟',我没有遇到过这样的错误 –

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:

此另一个问题后,在while循环每次你正在服用书的本地副本,并使用该指针list_add()

struct book book1; 

我建议对malloc每一次,所以对于每一个进入你将有单独的副本

+0

正确,但_why_我需要这样做吗? :) –

相关问题