malloc在struct中的struct数组

时间:2016-01-29 16:39:38

标签: c arrays struct

我已经做了一段时间的研究,而且我找不到任何可以帮助我的事情。

我有以下结构声明:

na.strings="NA"

尝试malloc的代码是(我为了简洁而删除了错误检查):

typedef struct position_struct{
    int x;
    int y;
} pos;

typedef struct item_struct{
    char member1;
    pos member2;
} item;

typedef struct room_stuct{
    item * member3;
    pos * member4;
    pos member5;
} roomLayout;

当我尝试这个时,分配到房间[1]会导致崩溃,但不会导致房间[0]。我的猜测是我实际上没有为整个阵列分配足够的空间而只有一个位置。但是我不明白为什么我相信我会跟随别处的所见。

如果有人可以向我解释为这种设置分配内存的程序,那将非常有帮助!谢谢。

4 个答案:

答案 0 :(得分:5)

您只为第一个member3分配member4room;不适合所有人。在行room->member3中,room位于内存段的开头,或room[0],它为10个成员3分配空间。但是,room[1]没有为任何成员3分配任何空间(类似于门)。通过循环分配来解决这个问题:

for(i = 0; i < 6; ++i)
{
    room[i].member3 = malloc(sizeof(room[i].member3) * 10);
    room[i].member4 = malloc(sizeof(room[i].member4) * 10);
}

free记忆时,记得使用类似的循环,即

for(i = 0; i < 6; ++i)
{
    free(room[i].member3);
    free(room[i].member4);
}

free(room);

答案 1 :(得分:2)

room->groundItems = malloc(sizeof(item) * 10);

以上代码仅为10分配room[0]个项目。

room[1 to 5]未分配,访问权限为UB

您必须先分配所有指针才能访问它们,如下所示

roomLayout * room = malloc(sizeof(roomLayout) * 6 )
for (int i=0; i<6; i++)
{
    room[i].groundItems = malloc(sizeof(item) * 10); //     10 ground items
    room[i].doors       = malloc(sizeof(pos)  * 10); //     10 doors
}

答案 2 :(得分:1)

您仅为第一个房间分配了groundItemsdoors,但您必须为所有6个房间分配它。每个房间都需要自己的groundItemsdoors列表。像这样调整你的代码:

roomLayout * room = malloc(sizeof(roomLayout) * 6 ); //     6 rooms
for ( int i = 0; i < 6; i ++ )
{
    room[i].groundItems = malloc(sizeof(item)       * 10); //     10 ground items
    room[i].doors       = malloc(sizeof(pos)        * 10); //     10 doors
}

注意room->groundItemsroom[0].groundItems类似。因此,在您的情况下room[0].groundItems[0].objectID有效,但room[1].groundItems[0].objectID失败,因为room[1].groundItems从未初始化。

答案 3 :(得分:0)

您遗失了room[1]room[2]等分配。 通过 room->groundItems = malloc...你有意思地说 room[0].groundItems = malloc ...

也许roomLayout的六个地方的分配让你感到困惑。它分配了指向groundItemsdoors数组的指针,但没有分配它们自己需要的空间。