通过“艰难学习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不一定直接调用函数来使用数组。我怀疑有人可能会建议将其声明为全局变量,那么替代方案是什么呢?双指针?双指针如何工作?
感谢您的时间。
答案 0 :(得分:1)
首先,malloc不保证从内存中分配新空间并返回它。如果它无法分配请求的内存,则返回NULL值。这就是为什么有必要检查指针。
在调用函数2时,可以使用保存function1中数组当前计数的变量来传递下一个元素的地址;
函数2(&安培; personList [计数++]);
然后将当前计数从function1返回到main函数;
int size = function1(personList);
答案 1 :(得分:1)
这里有一些指示(没有双关语!)来帮助你:
按照目前的情况,行struct Person personList[MAX_SIZE];
为MAX_SIZE
个Person
个结构分配内存。如果你正在做的话,你实际上不需要使用malloc
分配更多的内存。
但是,只需在实际需要人时分配内存,就可以节省一些内存。在这种情况下,您希望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);
数组不会神奇地保留任何特殊索引的记录。你必须自己做。一种方法是始终将数组的长度传递给需要它的每个函数。
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);
我认为这对您有所帮助。如果您想要更详细地解释某些内容,请发表评论。