1

如果我按如下方式初始化列表,如何访问该结构中的元素:

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'它并编译但在运行程序时出现分段错误错误。

4

4 回答 4

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;
于 2012-07-16T14:40:09.120 回答
4

虽然它编译得很好,但你没有正确分配内存。

您为 分配了内存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';
于 2012-07-16T14:54:58.147 回答
2

请记住,双重间接指针只是一个指向默认情况下恰好指向第一个条目的列表的指针。您需要为单个条目/条目分配,而不仅仅是列表指针 (**list),以下一些风格:

//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'; 
于 2012-07-16T14:47:17.977 回答
-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);
}

但是这种列表管理很奇怪,更不用说容易出错了。您应该认真考虑通过“链接列表”维护您的列表。像您给出的简单场景可以通过单链表轻松实现。

于 2012-07-16T14:59:21.720 回答