2017-02-18 100 views
0

我正在用C編寫簡單的程序,並得到了stucked。我有三個功能:C函數之間傳遞字符串

void changeStatusOfBook(User users[], Book books[]) { 
    char *id= askForBookID(); 
    Book book = getBookById(books, id); 
    . 
    . 
    . 
} 

char * askForBookID() { 
    char id[6]; 
    printf("Tell me which book (ID)\n"); 
    scanf_s("%5s",id, 6); 
    return id; 
} 

Book getBookById(Book books[], char bookID[]) { 
    int counter = 0; 
    //bookID becomes a trash here 
    . 
    . 
    . 
} 

的問題是:在第一個功能,我得到正確的用戶輸入的字符串,但是當我將它傳遞給第三個功能我得到它的一些垃圾。如何解決它?

+0

編譯所有警告和調試信息。請注意,當作爲參數傳遞時,數組會衰減爲指針。 –

回答

3

您不能從函數返回本地變量char id[]。它的內存位於堆棧上,並且函數返回該函數的所有堆棧內存並且其局部變量不再可訪問。

當堆棧上的內存需要另一個程序時,它會覆蓋char id的內存空間,這對您的程序來說會成爲問題。

char * askForBookID() { 
     //char id[6]; 
     char *id = malloc(sizeof(char)*6); 
     if(!id){ //check if malloc got some memory for id 
      printf("Sorry not enough memory"); return NULL; 

     } 

     printf("Tell me which book (ID)\n"); 
     scanf_s("%5s",id, 6); 

     return id; 
} 
+0

我更喜歡我的答案,因爲它不會對平臺上的c的實現做任何假設,但這個答案可能更有用。有一個upvote。 – Bathsheba

+0

@Bathsheba我同意你的意見。 –

+0

感謝它的工作 - 我試圖在changeStatusOfBook()中使用malloc,但不知道爲什麼我沒有考慮askForBookID()。 – MrKaszu

3

函數askForBookID返回具有自動存儲持續時間的數組的第一個元素的地址。

您使用該指針oncce函數的行爲被稱爲未定義。

改用malloc代替。