在结构内分配双指针结构?

Posted

技术标签:

【中文标题】在结构内分配双指针结构?【英文标题】:Malloc'ing a double pointer structure inside a struct? 【发布时间】:2021-11-26 08:49:59 【问题描述】:

这里是菜鸟。我正在尝试初始化一个简单的结构,如下所示:

typedef struct person_s 
    char *fname;                 ///< first name of the person
    char *lname;                 ///< last name of the person
    char *handle;               ///< handle of the person
    struct person_s **friends;  ///< dynamic collection of friends
    size_t friend_count;        ///< current number of friends
    size_t max_friends;         ///< current limit on friends
 person_t;

我想我理解对这个结构中的每个成员都使用 malloc,除了其中的双指针朋友结构。如何为这个双指针分配内存?

这是我用于其他数据成员的 malloc:

person_t *newperson(char *fn, char *ln, char *han)
    person_t *p = NULL;
    p = malloc(sizeof(person_t));

    p->fname = malloc(strlen(fn) +1);
    strcpy(p->fname, fn);

    p->lname = malloc(strlen(ln) +1);
    strcpy(p->lname, ln);

    p->handle = malloc(strlen(han) +1);
    strcpy(p->handle, han);

    p->*friends = malloc(sizeof(*friends));

    p->friend_count = malloc(2*sizeof(friend_count));
    p->friend_count = 0;

    p->max_friends = malloc(2*sizeof(max_friends));
    p->friend_count = 0;

编辑:我的错,我忘了包含在初始化这个结构的函数中。

Edit1:为了响应 cmets,我在这里想要实现的是创建一个动态的朋友“数组”,由 p->friends 数据成员指向。另外,我有一个动态哈希表,将它用作一个集合来放置与此人相关的所有朋友是否是一个好主意?指针和动态分配的概念对我来说仍然有些混乱,很抱歉造成误解。

【问题讨论】:

您最多期望max_friends 朋友。因此,您需要为指向其他朋友的max_friend 指针分配空间。 p-&gt;friends = malloc(max_friends * sizeof(*person_s)) 为什么你认为你需要在这里为friends 使用双指针? “我如何为这个双指针分配内存?” - 问题不在于如何。问题是为什么。这是一个 XY 问题。 另一件事,记得在发布之前最小化你的代码。你有很多不同的领域,只会让你的问题变得臃肿。并且 ptp 在结构中这一事实没有任何区别。 @klutt gotcha,谢谢! 【参考方案1】:

单指针就够动态收集了:

struct person_s *friends; 

...

p->friends = malloc(max_friends * sizeof(struct person_s));

【讨论】:

啊,明白了,谢谢!我认为一个集合需要双指针,因为我正在尝试创建一个朋友结构的“数组”(相同类型),这些朋友通过这个朋友数据成员链接到一个人。 或者更好:p-&gt;friends = malloc(max_friends * sizeof(*(p-&gt;friends)); 更好的是:p-&gt;friends = malloc(sizeof *p-&gt;friends * max_friends);(最好将size_t值放在首位,例如int * int * size_t可以避免溢出)。【参考方案2】:

首先保持语法简单,让我们假设您将typedefed struct person_s 设置为person

指向指针的指针与指向指针数组的指针是一回事。

所以,首先你需要分配数组,然后你需要分配数组中的各个元素。

这将分配数组:

friends = malloc(max_friends * sizeof(*friends));

这可行,因为friends 的类型为**person,所以*friends 的类型必须为*person

然后,您将需要一个 for 循环,在其中分配每个 person

friends[i] = malloc(sizeof(**friends)); //or sizeof(person), same thing.

(我在问题发布后立即输入了上面的内容,结果发现问题在我有机会回答之前就关闭了。后来问题被打开了,但我从未收到通知。我发布它是因为我不想现在就把它扔掉。)

【讨论】:

以上是关于在结构内分配双指针结构?的主要内容,如果未能解决你的问题,请参考以下文章

双结构指针的分配

双指针将 char 数组值分配给 char 数组,结构使用 char 指针

c中结构指针内的双数组

使用双指针为结构成员赋值

将二维数组分配为结构成员

从结构中释放双指针