C:内存使用和数组

时间:2015-08-27 11:44:04

标签: c arrays multidimensional-array malloc free

我有两个阵列(代表房间),其中有物品穿过空间。我找到了一种在论坛中分配ram的有趣方法。这是我在做的事情: 首先,我创建一个空房间,其中包含一些默认值。 之后我把一些元素放进去。有两个不同的项目。穿过房间的障碍物和物品。我有一个例如运行100次的迭代,并将所有项目放在一个坐标上。障碍保持其立场。

每次迭代都必须执行以下操作:

首先,它创建一个新的临时房间(new_room)。它复制了所有障碍因为它们停留在同一个地方(id = 3)。接下来,旧房间(房间)中的每个项目都会在new_room中获得新坐标。之后我改变房间,所以房间得到new_room。我的内存使用有一些大问题。我想在每次使用createRoomNew()创建一个新的new_room时释放旧的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);

1 个答案:

答案 0 :(得分:1)

从代码中可以看出,当你自由时,例如free(room_new),room_new最终被设置为NULL。情况并非如此

free()不会将指针设置为NULL(它不能),它仍指向指向内存不再可用的任何地方。在释放后,您需要手动将指针设置为NULL。