Malloc'ing 一个结构内部的双指针结构?
Malloc'ing a double pointer structure inside a struct?
这里是菜鸟。我正在尝试按如下方式初始化一个简单的结构:
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,除了其中的双指针 friends 结构。如何为这个双指针分配内存?
这是我对其他数据成员的 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:为了回应评论,我在这里试图实现的是创建一个由 p->friends 数据成员指向的朋友的动态“数组”。此外,我有一个动态散列 table,将它用作一个集合来放置与此人链接的所有朋友是否是个好主意?指针和动态分配的概念对我来说仍然有些混乱,请原谅我的误解。
动态收集单指针就够了:
struct person_s *friends;
...
p->friends = malloc(max_friends * sizeof(struct person_s));
首先保持语法简单,让我们假设你已经 typedef
ed struct person_s
as person
.
指向指针的指针与指向指针数组的指针相同。
因此,首先需要分配数组,然后需要分配数组中的各个元素。
这将分配数组:
friends = malloc(max_friends * sizeof(*friends));
这有效,因为 friends
是 **person
类型,所以 *friends
必须是 *person
.
类型
然后,您将需要一个 for
循环,在其中分配每个 person
:
friends[i] = malloc(sizeof(**friends)); //or sizeof(person), same thing.
(发完问题马上打了上面的,结果还没来得及回答就发现问题被关闭了,后来问题被打开了,但是一直没有通知我,我发帖了因为我不想现在就把它扔掉。)
这里是菜鸟。我正在尝试按如下方式初始化一个简单的结构:
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,除了其中的双指针 friends 结构。如何为这个双指针分配内存?
这是我对其他数据成员的 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:为了回应评论,我在这里试图实现的是创建一个由 p->friends 数据成员指向的朋友的动态“数组”。此外,我有一个动态散列 table,将它用作一个集合来放置与此人链接的所有朋友是否是个好主意?指针和动态分配的概念对我来说仍然有些混乱,请原谅我的误解。
动态收集单指针就够了:
struct person_s *friends;
...
p->friends = malloc(max_friends * sizeof(struct person_s));
首先保持语法简单,让我们假设你已经 typedef
ed struct person_s
as person
.
指向指针的指针与指向指针数组的指针相同。
因此,首先需要分配数组,然后需要分配数组中的各个元素。
这将分配数组:
friends = malloc(max_friends * sizeof(*friends));
这有效,因为 friends
是 **person
类型,所以 *friends
必须是 *person
.
然后,您将需要一个 for
循环,在其中分配每个 person
:
friends[i] = malloc(sizeof(**friends)); //or sizeof(person), same thing.
(发完问题马上打了上面的,结果还没来得及回答就发现问题被关闭了,后来问题被打开了,但是一直没有通知我,我发帖了因为我不想现在就把它扔掉。)