在C中,如何访问此结构中的元素?

时间:2012-07-16 14:34:22

标签: c pointers struct malloc

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

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 个答案:

答案 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”来维护你的清单。像你所给出的那种微不足道的场景可以通过单链表轻松实现。