2016-09-20 34 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_我需要這樣做嗎? :) –

相關問題