Добавить указатель структуры в конец указателя структур

Я искал форумы некоторое время, но не могу решить эту проблему. Он компилирует и делает почти все, что мне нужно, но одна вещь отключена. Всякий раз, когда я обновляю chore_array, который является указателем указателей на структуру 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

В моей основной функции, которая по сути задана и не может быть изменена, она вызывает функцию, которая инициализирует список chorelist и выделяет память каждому члену структуры структуры chorelist, чтобы я мог назначать значения и строки символов каждому из его членов. Моя проблема в том, что имя рутинной работы заменяется после каждого вызова функции, которая принимает список уже созданной рутинной работы.

Мой оператор присваивания в addChoreToLast выключен? заранее спасибо

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++;
}
Другие вопросы по тегам