2013-04-13 108 views
-1

我已經通過論壇搜索了一段時間,但似乎無法解決此問題。它編譯並完成了我需要它做的幾乎所有事情,但有一件事是關閉的。每當我更新一個chore_array,這是一個指向struct chore的指針指針時,新的更新會替換所有以前的賦值。將結構指針添加到結構指針的末尾

typdef struct _chore{ 
    char *chore_name; 
    int number; 
    char *due_date; 
    }chore; 
typedef struct _chorelist{ 
    chore **chore_array; 
    int occupied_number; 
    int size_of_array; 
    }chorelist; 

void addChoreToLast(chorelist *chore_list,chore *chore_input) 
{ 
    if(chore_list->occupied_number < chore_list->size_of_array) 
    { 
     chore_list->chore_array[chore_list->occupied_number]=chore_input; 
     chore_list->occupied_number++; 
    } 
    else 
    { 
     chorelist *pChoreList = (struct _chorelist*)malloc(sizeof(struct _chorelist)*chore_list->occupied_number); 
     memcpy(pChoreList,chore_list,sizeof(struct _chorelist*)+sizeof(struct _chore*)+1); 
     pChoreList = chore_list; 
     pChoreList->chore_array[pChoreList->occupied_number]=chore_input; 
     pChoreList->occupied_number++; 
    } 

代碼輸入:

Enter chore name  : Dishes 
Enter chore number : 1 
Enter Date to complete: 04/21/2013 

Enter another chore : Sweeping 
Enter chore number : 4 
Enter Date to complete: 05/02/2013 

代碼輸出:

Entered Chores are : Sweeping, Chore Number: 1, Date: 04/21/2013 
         Sweeping, Chore Number: 4, Date: 05/02/2013 

所需的輸出:

Entered Chores are : Dishes,  Chore Number: 1, Date: 04/21/2013 
         Sweeping, Chore Number: 4, Date: 05/02/2013 

在我的主要功能,它本質上是給予,不能改變,它調用一個函數initiali zes chorelist並分配內存給每個成員的chorelist結構,以便我可以給每個成員分配值和字符串。 我的問題是,在每次調用函數後都會替換雜項的名稱,該函數將採用已建立的雜項列表。

我的任務陳述在addChoreToLast off?在此先感謝

+1

'的memcpy(pChoreList,chore_list,的sizeof(結構_chorelist *)+的sizeof(結構_chore *)+ 1);'你忘由數乘以的佔用插槽。順便說一句:realloc()在這種情況下更容易。 – wildplasser

+0

確實,realloc是必要的:你應該釋放舊的列表,但是在任何情況下,整個else塊都是混亂和不正確的(你正在設置錯誤的變量)。 –

回答

1

您可以使用realloc

void addChoreToLast(chorelist *chore_list,chore *chore_input) { 
    chore **p = NULL; 
    if(chore_list->occupied_number == chore_list->size_of_array) { 
     p = realloc(chore_list->chore_array, (chore_list->size_of_array + 1) * sizeof(chore *)); 
     if(!p) { 
      perror("Can not allocate memory"); 
      return; 
     } 

     chore_list->size_of_array++; 
     chore_list->chore_array = p; 
    } 
    chore_list->chore_array[chore_list->occupied_number]=chore_input; 
    chore_list->occupied_number++; 
} 
+0

@NicholasWilson謝謝! – Bechir