我已经做了一段时间的研究,而且我找不到任何可以帮助我的事情。
我有以下结构声明:
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]。我的猜测是我实际上没有为整个阵列分配足够的空间而只有一个位置。但是我不明白为什么我相信我会跟随别处的所见。
如果有人可以向我解释为这种设置分配内存的程序,那将非常有帮助!谢谢。
答案 0 :(得分:5)
您只为第一个member3
分配member4
和room
;不适合所有人。在行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)
您仅为第一个房间分配了groundItems
和doors
,但您必须为所有6个房间分配它。每个房间都需要自己的groundItems
和doors
列表。像这样调整你的代码:
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->groundItems
与room[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
的六个地方的分配让你感到困惑。它分配了指向groundItems
和doors
数组的指针,但没有分配它们自己需要的空间。