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

发布于 2025-02-02 02:32:05 字数 1667 浏览 4 评论 0 原文

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

这是我当前的代码段:

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

My idea is to have a struct Person which holds the data for a person and a struct Family which contains the number of family members and an array with pointers to the persons. The persons shall be dynamically collected at runtime, stored on the heap, and the Family struct shall contain an array of pointers to these persons (members).
Now I have some troubles with this dynamic array and wonder how to properly allocate memory and add these pointers to the array.

This is my current code snippet:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

找回味觉 2025-02-09 02:32:05
f = realloc(f, sizeof(size_t) + (f->number_members) * sizeof(Person *));

上面的线毫无意义,需要删除。 family 是一个单个结构,其大小永远不会改变,无论其某些字段是否指向数组。它包含 size_t 字段和指针字段。两者的尺寸都是恒定的。您无需 realloc it。顺便说一句, struct 的大小不是其字段大小的总和。

f->members = p;

上面的行是一个错误。 f-&gt;成员指向 Person 的一系列指针。您想更新该数组的元素。通常使用 [] 运算符访问数组元素。该行应

f->members[i] = p;

确定应保留什么 i 作为练习。

*f[i].members

这也是一个错误。 f 不是数组,也不指向数组元素,因此 f [i] 不是您想要的。它是单个 struct 的指针。使用 - &gt; 运算符访问单个结构的字段。 成员是应该索引的。您需要

f->members[i]

demo

还有其他问题,例如不安全使用 scanf 不检查库函数的返回值包括但不限于 realloc

f = realloc(f, sizeof(size_t) + (f->number_members) * sizeof(Person *));

The line above makes no sense whatsoever and needs to be just deleted. A Family is a single struct, its size never changes, whether or not some of its fields point to arrays. It contains a size_t field and a pointer field. Sizes of both are constant. You never need to realloc it. By the way, the size of a struct is not the sum of sizes of its fields.

f->members = p;

The line above is an error. f->members points into an array of pointers to Person. You want to update an element of that array. An array element is normally accessed with the [] operator. The line should be

f->members[i] = p;

Determining what i should be is left as an exercise.

*f[i].members

This is also an error. f is not an array and does not point to an array element, so f[i] is not what you want. It is a pointer to a single struct. Fields of a single struct are accessed with the -> operator. members is the one that should be indexed. You need

f->members[i]

Demo

There are other problems, like unsafe use of scanf and not checking return values of library functions including, but not limited to, realloc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文