在结构内分配双指针结构?
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->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->friends = malloc(max_friends * sizeof(*(p->friends));
更好的是:p->friends = malloc(sizeof *p->friends * max_friends);
(最好将size_t
值放在首位,例如int * int * size_t
可以避免溢出)。【参考方案2】:
首先保持语法简单,让我们假设您将typedef
ed 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.
(我在问题发布后立即输入了上面的内容,结果发现问题在我有机会回答之前就关闭了。后来问题被打开了,但我从未收到通知。我发布它是因为我不想现在就把它扔掉。)
【讨论】:
以上是关于在结构内分配双指针结构?的主要内容,如果未能解决你的问题,请参考以下文章