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]
还有其他问题,例如unsafe use of scanf
and not checking return values of library functions including, but not limited to, realloc。
我的想法是有一个结构 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]
还有其他问题,例如unsafe use of scanf
and not checking return values of library functions including, but not limited to, realloc。