我已经做了一段时间的研究,我找不到任何可以帮助我的东西.
我有以下结构声明:
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;
Run Code Online (Sandbox Code Playgroud)
尝试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;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,分配到房间[1]会导致崩溃,但不会导致房间[0].我的猜测是我实际上没有为整个阵列分配足够的空间而只有一个位置.但我不明白为什么因为我相信我正在追随我在其他地方看到的东西.
如果有人可以向我解释为这种设置分配内存的程序,那将非常有帮助!谢谢.
你只是分配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);
}
Run Code Online (Sandbox Code Playgroud)
在free记忆时,记得使用类似的循环,即
for(i = 0; i < 6; ++i)
{
free(room[i].member3);
free(room[i].member4);
}
free(room);
Run Code Online (Sandbox Code Playgroud)