gpt4 book ai didi

c - 引用一个数组。递增和保存索引

转载 作者:行者123 更新时间:2023-11-30 14:23:23 26 4
gpt4 key购买 nike

通过“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,函数 1 又调用 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 不一定直接调用使用数组的函数。我怀疑有人可能建议将其声明为全局变量,那么还有什么选择呢?双指针?双指针如何工作?

感谢您的宝贵时间。

最佳答案

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

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

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

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

    一种可能更稳健的方法是将计数和数组一起封装到另一个结构中。

    struct PersonList { struct Person * list[MAX_SIZE];整数计数; }

    通过这种方式,您可以编写一组始终连贯地处理列表数据的函数 - 每当您添加新人员时,您总是会增加计数,依此类推。

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

我想这么多应该对你有帮助。如果您想获得更详细的解释,请发表评论。

关于c - 引用一个数组。递增和保存索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12926910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com