C:如何在另一个结构中的动态数组中存储指向结构的指针?

C: How to store pointers to structs in a dynamic array within another struct?

我的想法是有一个结构 Person 保存一个人的数据,一个结构 Family 包含家庭成员的数量和一个指向这些人的指针的数组。这些人应在运行时动态收集,存储在堆中,Family 结构应包含指向这些人的指针数组 (members)。 现在我在使用这个动态数组时遇到了一些麻烦,想知道如何正确分配内存并将这些指针添加到数组中。

这是我当前的代码片段:

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

typedef struct Person{
    int age;
    char first_name[256];
    char last_name[256];
} Person;

typedef struct {
    size_t number_members;
    Person **members;
} Family;

void init_person(Person *p);
void add_person_to_family(Family *f, Person *p);
void print_person(Person *p);

int main() {
    size_t number_members = 2;
    Family *f = calloc(1, sizeof(Family));

    for (int i = 0; i < number_members; ++i) {
        Person *p = calloc(1, sizeof(Person));
        init_person(p);
        add_person_to_family(f, p);
    }

    for (size_t i = 0; i < f->number_members; ++i) {
        print_person(*f[i].members);
    }
    return 0;
}

void init_person(Person *p)
{
    printf("Enter first name: \n");
    scanf("%s", p->first_name);
    printf("Enter last name: \n");
    scanf("%s", p->last_name);
    printf("Enter age: \n");
    scanf("%i", &p->age);
}

void add_person_to_family(Family *f, Person *p)
{
    f->number_members++;
    f = realloc(f, sizeof(size_t) + (f->number_members) * sizeof(Person *));
    f->members = realloc(f->members, (f->number_members) * sizeof(Person *));
    f->members = p;
}

void print_person(Person *p)
{
    printf("Age: %d\n", p->age);
    printf("First Name: %s\n", p->first_name);
    printf("Last Name: %s\n", p->last_name);
}
f = realloc(f, sizeof(size_t) + (f->number_members) * sizeof(Person *));

上面这行没有任何意义,需要删除。 Family 是一个单一的结构,它的大小永远不会改变,无论它的某些字段是否指向数组。它包含一个 size_t 字段和一个指针字段。两者的大小是恒定的。你永远不需要 realloc 它。顺便说一下,struct 的大小不是其字段大小的总和。

f->members = p;

上面一行是错误的。 f->members 指向指向 Person 的指针数组。您想要更新该数组的一个元素。通常使用 [] 运算符访问数组元素。该行应该是

f->members[i] = p;

确定 i 应该是什么留作练习。

*f[i].members

这也是一个错误。 f 不是数组,也不指向数组元素,所以 f[i] 不是你想要的。它是指向单个 struct 的指针。使用 -> 运算符访问单个结构的字段。 members 是应该被索引的那个。你需要

f->members[i]

Demo

还有其他问题,例如unsafe use of scanf and not checking return values of library functions including, but not limited to, realloc