如果我按如下方式初始化列表,如何访问此结构中的元素:
group **list = (group **) malloc(sizeof(group));
typedef struct
{
// ID of the group, 'A' to 'D'
char id;
// a list of members in the group
char **members;
} group;
我尝试使用(*list)->id = 'A'
并进行编译,但在运行程序时会出现分段错误错误。
答案 0 :(得分:5)
struct group
{
// ID of the group, 'A' to 'D'
char id;
// a list of members in the group
char **members;
};
//this initializes one group
group *a_group = malloc(sizeof(struct group)); //cast not needed in C
//this initializes an array of 10 group
group **list = malloc(sizeof(struct group *) * 10);
//initialize each one of the 10
for(int i = 0; i < 10; ++i){
list[i] = malloc(sizeof(struct group));
}
//get something out of group
a_group->id;
//get first group out of list
list[0]->id;
*list->id;
// 10 elements continuous memory
group *array_of_groups = malloc(sizeof(struct group) * 10);
array_of_groups[0].id;
*array_of_groups.id;
答案 1 :(得分:3)
虽然它编译得很好,但你没有正确分配内存。
您为group **list
分配了内存,这最终是一个指向struct group
的指针数组。我认为您打算做的事情是:
group** list = malloc(sizeof(group*) * 5); // e.g. 5 pointers
现在对于数组中的每个指针,分配自己的内存:
int i;
for (i = 0; i < 5; i++) {
list[i] = malloc(sizeof(group));
}
例如,要访问第二个结构中的id
,请执行以下操作:
list[1]->id = 'A';
请注意,*list
访问第一个结构,相当于list[0]
。
<强>旁注:强>
两个级别的间接允许您以不连续的方式将结构存储在内存中。或者,您可以使用一个间接级别并连续存储它们:
group list* = malloc(sizeof(group) * 5); // Again, 5 structs
然后使用以下命令访问成员:
list[0].id = 'A';
答案 2 :(得分:2)
请记住,双间接指针只是指向列表的指针,该指针默认情况下指向第一个条目。您需要为单个条目/条目分配,而不仅仅是列表指针(**列表),以下的一些风格:
//rough code, not tested... std caveats apply :)
group *one_group = malloc(sizeof(group));
list[0]=one_group;
list[0]->id = 'A'; // or one_group->id='A';
答案 3 :(得分:-1)
假设我必须制作一个指针列表。此列表的成员每个都指向按类型组映射的内存块。
现在假设我有10个项目,
这样:
group *tmp = malloc(sizeof(group) * 10);
现在tmp指向这些块的开始。
现在我想制作一个指针列表,其中列表中的每个项目都指向一个块。
让我们创建10个指针,
group ** list = malloc(sizeof(group *) * 10)
现在初始化这个指针列表:
i = 10;
while(i--) {
list++ = &(tmp++);
}
现在,您的列表已使用指向块的指针进行初始化。还有一个问题,你的列表指向最后一个。如果你不想那样
list-= 10;
现在您要从列表中检索某些内容:
while(i--) {
printf("%c\n", (*(list++))->a);
}
但是这种列表管理很奇怪,更不用说容易出错了。你应该认真考虑通过“LINKED LIST”来维护你的清单。像你所给出的那种微不足道的场景可以通过单链表轻松实现。