将结构指针添加到结构指针的末尾

时间:2013-04-13 18:59:32

标签: c pointers reference struct allocation

我在论坛上搜索了一段时间,但似乎无法解决这个问题。它编译并完成了我需要做的几乎所有事情,但有一点是关闭的。每当我更新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

在我的main函数中,它实际上是给定且无法更改的,它调用一个初始化 chorelist 的函数,并为 chorelist 结构的每个成员分配内存,以便我可以为每个成员分配值和字符串。 我的问题是每次调用函数后都会替换杂项的名称,这会占用已经建立的杂项列表。

我的作业声明是否在 addChoreToLast 中关闭?提前致谢

1 个答案:

答案 0 :(得分: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++;
}