参考数组。增加和保存指数

时间:2012-10-17 04:00:26

标签: c arrays function pointers

通过“艰难学习C”学习C,并做一些自己的练习。我偶然发现了以下问题。

假设我有以下结构:

struct Person {
  char name[MAX_INPUT];
  int age;
}

在main()中,我声明了以下数组:

int main(int argc, char *argv[]) { 
  struct Person personList[MAX_SIZE];
  return 0;
}

现在让我们说2个函数了(main调用function1调用function2)我想在一个我在main函数中声明的数组中保存一个人,如下所示:

int function2(struct Person *list) {
  struct Person *prsn = malloc(sizeof(struct Person));
  assert(prsn != NULL); // Why is this line necessary?

  // User input code goes here ... 

  // Now to save the Person created
  strcpy(prsn->name, nameInput);
  ctzn->age = ageInput;
  list = prsn; // list was passed by reference by function1, does main need to pass the array by
               // reference to function1 before?

  // This is where I get lost:
  // I want to increment the array's index, so next time this function is called and a 
  // new person needs to be saved, it is saved in the correct order in the array (next index)
}

所以,如果我回到我的主要功能,并希望打印保存在其中的前三个人:

...
int i = 0;
for(i = 0; i < 3; i++) {
  printf("%s is %d old", personList[i].name, personList[i].age);
}
...

基本上如何在应用程序中引用该数组,同时保持其持久性。请记住,main不一定直接调用函数来使用数组。我怀疑有人可能会建议将其声明为全局变量,那么替代方案是什么呢?双指针?双指针如何工作?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

首先,malloc不保证从内存中分配新空间并返回它。如果它无法分配请求的内存,则返回NULL值。这就是为什么有必要检查指针。

在调用函数2时,可以使用保存function1中数组当前计数的变量来传递下一个元素的地址;

函数2(&安培; personList [计数++]);

然后将当前计数从function1返回到main函数;

int size = function1(personList);

答案 1 :(得分:1)

这里有一些指示(没有双关语!)来帮助你:

  1. 按照目前的情况,行struct Person personList[MAX_SIZE];MAX_SIZEPerson个结构分配内存。如果你正在做的话,你实际上不需要使用malloc分配更多的内存。

  2. 但是,只需在实际需要人时分配内存,就可以节省一些内存。在这种情况下,您希望personList数组包含指针Person结构,而不是结构本身(使用malloc创建)。

    即:struct Person * personList[MAX_SIZE];

    创建此人时:

    struct Person * person = (struct Person *) malloc(sizeof(struct Person));

    personList[index] = person;

    当您使用人员列表时:printf("%s", personList[index]->name);

  3. 数组不会神奇地保留任何特殊索引的记录。你必须自己做。一种方法是始终将数组的长度传递给需要它的每个函数。

    void function1(struct Person * personList, int count);

    如果你想在返回调用函数时修改count变量,你可以通过引用传递它:

    void function1(struct Person * personList, int * count);

    一种可能更强大的方法是将计数和数组封装在另一个结构中。

    struct PersonList { struct Person * list[MAX_SIZE]; int count; }

    通过这种方式,您可以编写一组始终处理列表数据的函数 - 无论何时添加新人,您总是递增计数,依此类推。

    int addNewPerson(struct PersonList * personList, char * name, int age);

  4. 我认为这对您有所帮助。如果您想要更详细地解释某些内容,请发表评论。