我有两个数组(表示房间),其中的物品在空间中移动。我发现了一个有趣的方式来分配公羊在这里的论坛。下面是我正在做的:首先,我用一些默认值创建一个空房间。之后我加入了一些元素。有两个不同的项目。一个障碍物和一个穿过房间的物品。例如,我有一个迭代运行100次,并将所有项目进一步放置一个坐标。障碍物保持他们的位置。
每次迭代必须完成以下操作:
首先创建一个新的临时房间(new_room)。它复制所有障碍,因为它们停留在相同的位置(id = 3)。接下来,来自旧房间(房间)的每个物品在new_room中获得新的坐标。之后我改变了房间,所以room变成了new_room。我在内存使用方面有一些大问题。我想在每次使用createRoomNew()创建新房间时释放旧的new_room。在这个实现中,我得到了一个分段错误。我想是因为changeroom()的功能。
我现在真的很困惑,因为我是新的C....我希望我讲明白了我的意思。非常感谢!
item_node ***room;
item_node ***room_new;
void createRoom(int x, int y, int z)
{
if (room == NULL) {
item_node *allElements = malloc(x * y * z * sizeof(item_node));
room = malloc(x * sizeof(item_node **));
for(int i = 0; i < x; i++)
{
room[i] = malloc(y * sizeof(item_node *));
for(int j = 0; j < y; j++)
{
room[i][j] = allElements + (i * y * z) + (j * z);
}
}
for (j = 0; j < x_format; j++) {
for (k = 0; k < y_format; k++) {
for (l = 0; l < z_format; l++) {
room[j][k][l].id = 3;
room[j][k][l].next = NULL;
}
}
}
}
}
void createRoomNew(int x, int y, int z)
{
if (room_new != NULL) {
for(int i = 0; i < x; i++)
{
free(room_new[i]);
}
free (room_new);
room_new = NULL;
}
if (room_new == NULL) {
item_node *allElements = malloc(x * y * z * sizeof(item_node));
room_new = malloc(x * sizeof(item_node **));
for(int i = 0; i < x; i++)
{
room_new[i] = malloc(y * sizeof(item_node *));
for(int j = 0; j < y; j++)
{
room_new[i][j] = allElements + (i * y * z) + (j * z);
}
}
}
for (j = 0; j < x_format; j++) {
for (k = 0; k < y_format; k++) {
for (l = 0; l < z_format; l++) {
if ((room[j][k][l].next) != NULL) {
if ((room[j][k][l].next->id) == 1) {
room_new[j][k][l] = room[j][k][l];
} else {
room_new[j][k][l].id = 3;
room_new[j][k][l].next = NULL;
}
}
else {
room_new[j][k][l].id = 3;
room_new[j][k][l].next = NULL;
}
}
}
}
}
void changeRoom(item_node *** newRoom)
{
room = newRoom;
}
示例调用:
createRoom(200, 200, 200);
createRoomNew(200, 200, 200);
changeRoom(room_new);
createRoomNew(200, 200, 200);
changeRoom(room_new);
从代码看来,你认为,当你做自由,例如自由(room_new), room_new最终被设置为NULL。事实并非如此
free()不会将指针设置为NULL(它不能),它仍然指向它所指向的地方,只是内存不再可用。您需要在释放后手动将指针设置为NULL