【问题标题】:Malloc 'ing array of struct in structstruct 中的 malloc 结构数组
【发布时间】:2016-01-29 16:39:38
【问题描述】:

我已经做了一段时间的研究,但没有找到任何对我有帮助的东西。

我有以下结构声明:

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;

尝试对其进行 malloc 的代码是(为简洁起见,我删除了错误检查):

 roomLayout *genFloor () {
                                                         // Allocate mem for Arrays of:
    roomLayout * room = malloc(sizeof(roomLayout) * 6 ); //     6 rooms
    room->member3     = malloc(sizeof(item)       * 10); //     10 member3's
    room->member4     = malloc(sizeof(pos)        * 10); //     10 member4's

    /* TESTING */
    room[0].member3[0].member1 = 'd';
    printf("Room[0] is good\n");
    room[1].member3[0].member1 = 'd';
    printf("Room[1] is good\n");           // Never prints/makes it to this line


    return room;
 }

当我尝试这个时,分配给 room[1] 会导致崩溃,但不会导致 room[0]。我的猜测是我实际上没有为整个数组分配足够的空间,只有一个位置。但我不明白为什么,因为我相信我在追随我在其他地方看到的东西。

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

【问题讨论】:

  • flexible array members 你可能会感兴趣。
  • 停止将数组视为指针。您永远不会为数组分配内存,甚至不会为指针分配内存。您分配一个内存块,然后使用指针指向那里。请解释一下您的“阵列”是如何指向那​​里的?

标签: c arrays struct


【解决方案1】:

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

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-ing 内存时,记得使用类似的循环,即

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

free(room);

【讨论】:

  • 这就是我的想法,我只是不知道如何解决它。谢谢!我在任何地方都找不到任何人在做 for 循环!
【解决方案2】:
room->groundItems = malloc(sizeof(item) * 10);

上面的代码为room[0]分配了一个10项目。

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
}

【讨论】:

    【解决方案3】:

    您只为第一个房间分配了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-&gt;groundItems 类似于room[0].groundItems。所以在你的情况下room[0].groundItems[0].objectID 工作,但room[1].groundItems[0].objectID 失败,因为room[1].groundItems 从未初始化。

    【讨论】:

      【解决方案4】:

      您缺少对room[1]room[2] 等的分配。 经过 room-&gt;groundItems = malloc...你含蓄地说 room[0].groundItems = malloc ....

      可能roomLayout的6个地方的分配让你迷惑了。它分配了指向groundItemsdoors 数组的指针,但没有分配它们自己需要的空间。

      【讨论】:

        猜你喜欢
        • 2022-01-07
        • 1970-01-01
        • 2011-07-24
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 2016-02-26
        • 1970-01-01
        相关资源
        最近更新 更多