0

通过“Learning C the hard way”学习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 不一定直接调用使用数组的函数。我怀疑有人可能会建议将其声明为全局变量,那么替代方案是什么?双指针?双指针是如何工作的?

感谢您的时间。

4

2 回答 2

1

这里有一些提示(不是双关语!)可以帮助您:

  1. 就目前而言,该行为结构数struct Person personList[MAX_SIZE];分配内存。如果这是您正在做的事情,您实际上不需要分配更多内存。MAX_SIZEPersonmalloc

  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);

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

于 2012-10-17T04:30:09.330 回答
1

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

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

function2(&personList[count++]);

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

int size=function1(personList);

于 2012-10-17T04:15:59.833 回答